回覆列表
  • 1 # 使用者7364316064609

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

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

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

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

  • 中秋節和大豐收的關聯?
  • 小時候你吃過白糖拌飯嗎?你覺得味道怎麼樣?