回覆列表
-
1 # 使用者1882198426090
相關內容
- 電腦把word檔案傳輸給別人,再用手機把剛傳輸的檔案傳輸給另一個人,當這個人用電腦開啟後文件會變嗎?
- 微信最不科學的十個設計,每個都不能忍!(附解決方法)
- 手機與電腦間如何進行無線連線進行檔案傳輸?
- win7電腦沒有網路,沒有藍芽,沒有手機驅動,如何將手機檔案傳輸到這臺電腦上?
- ftp協議的全稱是什麼?如何架構檔案傳輸伺服器?
- 有什麼好用又簡單的檔案傳輸軟體?
- 國產手機(特別是旗艦)比iPhone好在哪裡?
- 有什麼好的全平臺檔案傳輸的軟體,重點是免費的,或者學生免費的?ios安卓window linux?
- 兩臺電腦,一臺有網,一臺沒網,並且沒網的電腦不能聯網,要怎麼實現這兩臺電腦之間的檔案傳輸呢?
- 微信與QQ怎麼互傳檔案?原來方法這麼簡單,我也是剛知道
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);