国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用Socket實現點對點的文件傳輸

2019-11-17 05:06:56
字體:
來源:轉載
供稿:網友
  System.Sockes命名空間了實現 Berkeley 套接字接口。通過這個類,我們可以實現網絡計算機之間的消息傳輸和發送。而在我下面要討論的這個議題里,我們將討論的是用套接字實現文件的傳輸.這種方法有別于FTP協議實現的的文件傳輸方法,利用ftp的方法需要一個專門的服務器和客戶端,無疑于我們要實現的點對點的文件傳輸太為復雜了一些。在這里,我們實現一個輕量級的方法來實現點對點的文件傳輸,這樣就達到了intenet上任何兩個計算機的文件共享。  在兩臺計算機傳輸文件之前,必需得先有一臺計算機建立套接字連接并綁定一個固定得端口,并在這個端口偵聽另外一臺計算機的連接請求。socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, PRotocolType.Tcp);
socket.Blocking = true ;
ipEndPoint computernode1 = new IPEndPoint(serverIpadress, 8080);socket.Bind(computernode1);socket.Listen(-1);  當有其他的計算機發出連接請求的時候,被請求的計算機將對每一個連接請求分配一個線程,用于處理文件傳輸和其他服務。while ( true ) {clientsock = socket.Accept();if ( clientsock.Connected ) {Thread tc = new Thread(new ThreadStart(listenclient));tc.Start();}}  下面的代碼展示了listenclient方法是如何處理另外一臺計算機發送過來的請求。首先并對發送過來的請求字符串作出判定,看看是何種請求,然后決定相應的處理方法。void listenclient()
{
Socket sock = clientsock ;
try
{
while ( sock != null )
{
byte[] recs = new byte[32767];
int rcount = sock.Receive(recs,recs.Length,0) ;
string message = System.Text.Encoding.ASCII.GetString(recs) ;
//對message作出處理,解析處請求字符和參數存儲在cmdList 中
execmd=cmdList[0];
sender = null ;
sender = new Byte[32767];

string parm1 = "";
//目錄列舉
if ( execmd == "LISTING" )
{
ListFiles(message);
continue ;
}
//文件傳輸
if ( execmd == "GETOK" )
{
cmd = "BEGINSEND " + filepath + " " + filesize ;
sender = new Byte[1024];
sender = Encoding.ASCII.GetBytes(cmd);
sock.Send(sender, sender.Length , 0 );
//轉到文件下載處理
DownloadingFile(sock);
continue ;
}
}
}
catch(Exception Se)
{
string s = Se.Message;
Console.WriteLine(s);
}
}

至此,基本的工作已經完成了,下面我們看看如何處理文件傳輸的。
while(rdby < total && nfs.CanWrite)
{
//從要傳輸的文件讀取指定長度的數據
len =fin.Read(buffed,0,buffed.Length) ;
//將讀取的數據發送到對應的計算機
nfs.Write(buffed, 0,len);
//增加已經發送的長度
rdby=rdby+len ;
}  從上面的代碼可以看出是完成文件轉換成FileStream 流,然后通過NetworkStream綁定對應的套節子,最后調用他的write方法發送到對應的計算機。

  我們再看看接受端是如何接受傳輸過來的流,并且轉換成文件的:
NetworkStream nfs = new NetworkStream(sock) ;
try
{
//一直循環直到指定的文件長度
while(rby < size)
{
byte[] buffer = new byte[1024] ;
//讀取發送過來的文件流
int i = nfs.Read(buffer,0,buffer.Length) ;
fout.Write(buffer,0,(int)i) ;
rby=rby+i ;
}
fout.Close() ;  從上面可以看出接受與發送恰好是互為相反的過程,非常簡單。

  至此,單方向的文件傳輸就完成了,只需要在每個對等的節點上同時實現上面的發送和接受的處理代碼就可以做到互相傳輸文件了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 张家口市| 丰都县| 上思县| 微山县| 于田县| 雅江县| 胶州市| 贡山| 育儿| 泰来县| 遵义县| 麻阳| 金溪县| 乐至县| 中西区| 忻城县| 延庆县| 邛崃市| 孟村| 康保县| 梁河县| 昌都县| 曲周县| 英山县| 灵台县| 井冈山市| 石城县| 赤峰市| 新野县| 登封市| 封开县| 临潭县| 夏津县| 博兴县| 浮山县| 延安市| 海城市| 卫辉市| 武冈市| 进贤县| 晋中市|