用Socket實現點對點的檔案傳輸 (轉)

amyz發表於2007-08-15
用Socket實現點對點的檔案傳輸 (轉)[@more@]

Socket實現點對點的傳輸:namespace prefix = o ns = "urn:schemas--com::office" />

System.Sockes名稱空間了實現 Berkeley 套接字介面。透過這個類,我們可以實現之間的訊息傳輸和傳送.而在我下面要討論的這個議題裡,我們將討論的是用套節子實現檔案的傳輸.這種方法有別於實現的的方法,利用ftp的方法需要一個專門的和客戶端,無疑於我們要實現的點對點的檔案傳輸太為複雜了一些。在這裡,我們實現一個輕量級的方法來實現點對點的檔案傳輸,這樣就達到了int上任何兩個計算機的檔案共享。

在兩臺計算機傳輸檔案之前,必需得先有一臺計算機建立套節子連線並繫結一個固定得埠,並在這個埠偵聽另外一臺計算機的連線請求。

socket = new Socket(Addresamily.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 );


  //轉到檔案處理


  ingFile(sock);


  continue ;


  } 


 }


  }


  catch(Exception Se)


  {


  string s = Se.Message;


  Console.WriteLine(s);


  }


}



至此,基本的工作已經完成了,下面我們看看如何處理檔案傳輸的。


while(ry < 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() ;



從上面可以看出接受與傳送恰好是互為相反的過程,非常簡單。


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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-957724/,如需轉載,請註明出處,否則將追究法律責任。

相關文章