C#檔案傳輸

來源:互聯網
上載者:User

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

}



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。