用Socket實現點對點的檔案傳輸 (轉)
用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用Delphi編寫點對點傳檔案程式(1) (轉)
- 用Delphi編寫點對點傳檔案程式(2) (轉)
- 點對點傳輸現狀,鐳速高速點對點傳輸解決方案
- C# Socket 檔案傳送傳輸C#
- Java實現檔案斷點續傳Java斷點
- Java Socket圖片檔案傳輸Java
- Android 使用 Socket 對大檔案進行加密傳輸Android加密
- 支援斷點續傳的大檔案傳輸協議斷點協議
- python3 socket檔案傳輸Python
- JAVA實現大檔案分片上傳斷點續傳Java斷點
- 用Go語言實現多協程檔案上傳,斷點續傳,你如何實現?Go斷點
- Linux如何實現斷點續傳檔案功能?Linux斷點
- Node.js實現大檔案斷點續傳Node.js斷點
- 無外掛實現大檔案分片上傳,斷點續傳斷點
- Android Wifi熱點 資料傳輸Socket 通訊AndroidWiFi
- 大檔案傳輸軟體怎麼選?重點看這一點
- Linux——檔案傳輸協議知識點梳理Linux協議
- PHP實現檔案下載斷點續傳詳解PHP斷點
- Java斷點續傳(基於socket與RandomAccessFile的簡單實現)Java斷點randomMac
- 實現linux和windows檔案傳輸LinuxWindows
- 如何實現檔案高速傳輸,推薦鐳速高速檔案傳輸解決方案
- 使用webuploader元件實現大檔案分片上傳,斷點續傳Web元件斷點
- Socket 傳送檔案
- 揭秘鐳速傳輸點對點傳輸技術,NAT+Raysync強強組合
- 用Java實現斷點續傳(HTTP)Java斷點HTTP
- 基於序列化技術(Protobuf)的socket檔案傳輸
- Android 實現無網路傳輸檔案Android
- 簡單實現TCP下的大檔案高效傳輸TCP
- 如何實現檔案傳輸系統的多儲存
- Android使用Socket(Tcp/Udp)協議進行資料傳輸(傳輸大檔案)AndroidTCPUDP協議
- OkHttp使用+檔案的上傳+斷點續傳HTTP斷點
- 短影片原始碼實現流式傳輸,降低處理大檔案時對記憶體的佔用原始碼記憶體
- HTTP檔案斷點續傳的原理HTTP斷點
- 用 Java 儲存點陣圖檔案 (轉)Java
- 點對點(P2P)檔案共享站點的危險
- 為實現跨境檔案高速傳輸,鐳速傳輸都用了哪些技術?
- 為實現跨境檔案高速傳輸,鐳速傳輸都用了哪些技術
- 大檔案如何傳輸,大檔案的傳輸方式有哪些?