原文**:http://hi.baidu.com/eleven%5f2020/blog/item/8217de2e8a8c093a359bf763.html
c#中socket的運用
2010-08-31 12:01
流的說明:資料的傳輸都會用到流,一般的檔案如文字、等,可以運用filestream類來完成。物件的傳輸也要轉換成流,只不過我們稱之為物件的序列化。所以不管是檔案還是記憶體中的物件,要實現傳輸都會轉換成有序列的二進位制陣列,然後在進行傳輸。
c#中可運用socket物件來完成計算機之間的資料傳輸。
傳送資料主機:
1、建立socket物件
socket socketsend = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
2、遠端ip和埠號
pendpoint remotepoint = new ipendpoint(ipaddress.parse(遠端ip), 8002);
3、連線遠端主機
socketsend.connect(remotepoint);
4、資訊轉換成位元組陣列
byte buff = system.text.encoding.default.getbytes(資訊));
5、傳送資料
socketsend.send(buff);
6、關閉socket
socketsend.close();
接送資料主機
1、建立socket物件
socket socketlisten = new socket(addressfamily.internetwork, sockettype.stream, protocoltype.tcp);
2、本機ip和埠號
ipendpoint hostpoint = new ipendpoint(dns.gethostentry(dns.gethostname()).addresslist[0], 8002);
3、socket繫結到該結點上
socketlisten.bind(hostpoint);
4、讓socket物件處於監聽狀態
socketlisten.listen(50);
5、建立連線請求
while (true)
6、處理資料
public void dataprocess(object obj)
c#中socket的運用(二)
2010-08-31 14:38
在做socket程式設計時,我們一般會遇到以下問題:
1、如何判斷傳送方傳送的是文字資訊還是檔案
可以先傳送判斷型別的字串如:"msg"或"file",再傳送相關資訊,另一方接送到後先解析型別,在處理接收到的資訊。
傳送發:
socketsend.send(system.text.encoding.default.getbytes("msg"));
thread.sleep(100);//這裡一定要sleep一會,不然接收到的可能有後面傳送的資訊
socketsend.send(其他資訊);
接收方:
byte buff = new byte[1024];
int len =socket.receive(buff);//進行第一次receive,獲取型別字串,若傳送時沒有sleep一會,這裡可能接送到所有資訊,可通過擷取字串判斷。
string type= system.text.encoding.default.getstring(buff, 0, len);
if (type == "msg")
傳送檔案則是同樣的原理。
2、傳輸大資料的處理
在進行資料傳輸時,我們會去建立臨時的快取區域,用於資料的讀寫,當傳輸大資料時,只需迴圈完成讀寫操作。
例如:傳輸大量文字資訊
socketsend.send(system.text.encoding.default.getbytes(大量資訊));
接收方:
byte buff = new byte[1024];//建立快取區域
int mlen = 0;
stringbuilder sb = new stringbuilder();
while ((mlen = socket.receive(buff)) != 0)//迴圈讀取資料
fs.close();//傳送完關閉檔案流
thread.sleep(100);
string end = "end";//表示傳送完
socketsend.send(system.text.encoding.default.getbytes(end));
socketsend.close();
接收方:
//建立寫入檔案流
filestream fs = new filestream("d://" + filename, filemode.openorcreate, fileaccess.write);
int mlen = 0;
while ((mlen = socket.receive(buff)) != 0)//迴圈讀取
fs.write(buff, 0, mlen);//讀一次寫一次
}fs.close();
messagebox.show("檔案傳輸完成");
C 建立和運用socket鏈結池
系統採用的就是這種方式。使用者數量足夠多的時候,只須要動態新增鏈結池的數量即可。下面我們用具體的程式來講解下 首先我們宣告乙個socket類 public class xiegousocket 下面的函式是建立 socket鏈結池,這裡為了使 更加清晰,我特地把異常處理部分全部取掉了。public ...
C 中split的運用
1 public string split params char separator 2 public string split char separator,int count 3 public string split char separator,stringsplitoptions opt...
c 中operator的運用
operator 只要是運算子都能過載 operator 關鍵字的主要作用是用來過載運算子的,還可以用於類或結構中型別的自定義轉換。下面看個例子 csharp view plain copy class feige 過載加法運算子 public static feige operator feige...