用Socket實現點對點的文件傳輸 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- 用Socket實現點對點的文件傳輸 (http://www.webasp.net/article/8/7820.htm) |
| -- 作者:未知 -- 發佈日期: 2003-10-03 |
| 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() ; 從上面可以看出接受與發送恰好是互為相反的過程,非常簡單。 至此,單方向的文件傳輸就完成了,只需要在每個對等的節點上同時實現上面的發送和接受的處理代碼就可以做到互相傳輸文件了。 |
| webasp.net |