首頁>Club>
7
回覆列表
  • 1 # 使用者1882198426090

    C#檔案傳輸

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

    從上面可以看出接受與傳送恰好是互為相反的過程,非常簡單。//取得預儲存的檔名

    string fileName="test.rar";

    //遠端主機

    string hostName=TextBoxHost.Text.Trim();

    //埠

    int port=80;

    //得到主機資訊

    IPHostEntry ipInfo=Dns.GetHostByName(hostName);

    //取得IPAddress[]

    IPAddress[] ipAddr=ipInfo.AddressList;

    //得到ip

    IPAddress ip=ipAddr[0];

    //組合出遠端終結點

    IPEndPoint hostEP=new IPEndPoint(ip,port);

    //建立Socket 例項

    Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

    try

    {

    //嘗試連線

    socket.Connect(hostEP);

    }

    catch(Exception se)

    {

    LeixunCMS.Common.MessageBox.Show(this.Page,"連線錯誤"+se.Message);

  • 中秋節和大豐收的關聯?
  • 如果《水滸傳》中的宋江變成劉備,那麼起義會成功嗎?