私有字符串path =“F:\ \ smart movie。EXE“;//要發送的文件
私有套接字s;
私有void listen()
{
string IP =“127 . 0 . 0 . 1“;//遠程IP在這裏定義為自己的機器。
IP address【】ih = Dns。GetHostAddresses(IP);//獲取IP列表
IP address newip = ih【0】;//獲取IP地址
int port = 6789//定義端口
IPEndPoint conn cet = new IPEndPoint(newip,port);//構造節點
s =新套接字(地址系列。互聯網,SocketType。協議類型的流。TCP);//初始化套接字
嘗試
{
南連接;//連接到遠程服務器
if(s . Connected)//如果連接成功則為真,否則為假。
{
控制臺。WriteLine(“連接成功“);
Thread t =新線程(new ThreadStart(set));//創建流程
t.start();//開始進程
控制臺。WriteLine(“發送完成”)
}
}
catch(NullReferenceException e)
{
控制臺。WriteLine(“{ 0 }”,e);
}
private void set()//創建壹個set函數。
{
控制臺。WriteLine(“開始發送數據“);
byte【】b =新字節【1000000】;//創建壹個文件緩沖區,其中可以考慮文件的最大值。
FileStream file =文件。打開(路徑,文件模式。打開文件訪問。閱讀);//創建文件流
int start = 0;
int end =(int)文件長度;//獲取文件長度文件傳輸如果需要超出int的範圍,估計會重寫FileStream類。
嘗試
{
while(end!= 0)
{
int count = file。read(b,開始,結束);//將數據寫入流中
start+= count;
end -=計數;
}
while(開始!= 0)
{
int n = s . Send(b,end,start,SocketFlags。無);//用Socket的Send方法發送流。
end+= n;
start-= n;
}
文件。close();//關閉文件流
南close();//關閉套接字
}
catch(NullReferenceException e)
{
控制臺。WriteLine(“{ 0 }”,e);
}
}
這樣就實現了文件發送的模型。
接下來,要接收文件,我們必須首先確定對方發送的文件的長度。實際上,發送文件長度的功能應該添加到上面的段落中。實現非常簡單,即發送int變量end,然後要求接收代碼返回壹個布爾值來確定是否發送它。在這裏,為了使它更清楚,原則沒有實現。
私有void get()
{
string path =“G:\ da . exe“;//接收的文件
FileStream file =新的FileStream(路徑,文件模式。OpenOrCreate,FileAccess。寫);//寫入文件流
TcpListener listener = new TcpListener(6789);//監聽端口
套接字s1 =新套接字(AddressFamily。互聯網,SocketType。協議類型的流。TCP);//定義套接字並初始化它。
嘗試
{
聽著。start();//開始聆聽
s1 =聽。accept socket();//獲取套接字連接
byte【】data =新字節【1000000】;//定義緩沖區
int longer = data。長度;
int start = 0;
int mid = 0;
if(s 1。已連接)//確認連接。
{
控制臺。WriteLine(“連接成功“);
int count = s1。接收(數據,開始,較長,套接字標誌。無);//將接收到的字節存儲在緩沖區中。
mid+= count;
longer-= mid;
while(數數!= 0)
{
計數= s1。接收(數據、mid、longer、SocketFlags。無);
mid+= count;
longer-= mid;
}
文件。write(data,0,1214134);//寫入文件,1214134為文件大小,通過socket發送即可獲取。代碼之前已經解釋過了。
s1。close();
文件。close();
}
}
catch(NullReferenceException e)
{
控制臺。WriteLine(“{ 0 }”,e);
}
}