日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#Socket詳細(xì)剖析

C#語言還是比較常見的東西,這里我們主要介紹C# Socket,包括介紹建立本機(jī)的IPEndPoint對象等方面。

興安盟ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

其實(shí)只要用到Socket聯(lián)接,基本上就得使用Thread,是交叉使用的。C# Socket用法基本上不算很復(fù)雜,只是不知道托管之后的Socket有沒有其他性能或者安全上的問題。在C#里面能找到的***層的操作也就是socket了,概念不做解釋。

程序模型如下:
◆WinForm程序 : 啟動端口偵聽;監(jiān)視Socket聯(lián)接情況;定期關(guān)閉不活動的聯(lián)接;
◆Listener:處理Socket的Accept函數(shù),偵聽新鏈接,建立新Thread來處理這些聯(lián)接(Connection)。
◆Connection:處理具體的每一個(gè)聯(lián)接的會話。

1:WinForm如何啟動一個(gè)新的線程來啟動Listener:

 
 
 
  1.  //start the server
  2. private void btn_startServer_Click(object sender, EventArgs e)
  3. {
  4. //this.btn_startServer.Enabled = false;
  5. Thread _createServer = new Thread(new ThreadStart(WaitForConnect));
  6. _createServer.Start();
  7. }
  8. //wait all connections
  9. private void WaitForConnect()
  10. {
  11. SocketListener listener = new SocketListener(Convert.ToInt32(this.txt_port.Text));
  12.  listener.StartListening();
  13. }

因?yàn)閭陕犅?lián)接是一個(gè)循環(huán)等待的函數(shù),所以不可能在WinForm的線程里面直接執(zhí)行,不然Winform也就是無法繼續(xù)任何操作了,所以才指定一個(gè)新的線程來執(zhí)行這個(gè)函數(shù),啟動偵聽循環(huán)。
這一個(gè)新的線程是比較簡單的,基本上沒有啟動的參數(shù),直接指定處理函數(shù)就可以了。

2:Listener如何啟動循環(huán)偵聽,并且啟動新的帶有參數(shù)的線程來處理Socket聯(lián)接會話。

先看如何建立偵聽:(StartListening函數(shù))

 
 
 
  1. // Create a TCP/IP socket.
  2. Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  3. // Bind the socket to the local endpoint andlisten for incoming connections.
  4. try
  5. {
  6. listener.Bind(localEndPoint);
  7. listener.Listen(20);//20 trucks
  8. // Start listening for connections.
  9. while (true)
  10. {
  11. // here will be suspended while waiting for a new connection.
  12. Socket connection = listener.Accept();
  13. Logger.Log("Connect", connection.RemoteEndPoint.ToString());//log it, new connection
  14. ……
  15. }
  16. }
  17. ……

基本步驟比較簡單:
建立本機(jī)的IPEndPoint對象,表示以本機(jī)為服務(wù)器,在指定端口偵聽;然后綁定到一個(gè)偵聽Socket上;進(jìn)入while循環(huán),等待新的聯(lián)接;如果有新的聯(lián)接,那么建立新的socket來對應(yīng)這個(gè)聯(lián)接的會話。

值得注意的就是這一句聯(lián)接代碼:listener.Accept()。執(zhí)行這一句的時(shí)候,程序就在這個(gè)地方等待,直到有新的聯(lián)檢請求的時(shí)候程序才會執(zhí)行下一句。這是同步執(zhí)行,當(dāng)然也可以異步執(zhí)行。

新的聯(lián)接Socket建立了(Accept之后),對于這些新的socket該怎么辦呢?他們依然是一個(gè)循環(huán)等待,所以依然需要建立新的Thread給這些Socket去處理會話(接收/發(fā)送消息),而這個(gè)Thread就要接收參數(shù)了。Thread本身是不能接收參數(shù)的,為了讓它可以接收參數(shù),可以采用定義新類,添加參數(shù)作為屬性的方法來解決。因?yàn)槊恳粋€(gè)Socket是一個(gè)Connection周期,所以我定義了這么一個(gè)類public class Connection。這個(gè)類至少有這樣一個(gè)構(gòu)造函數(shù)public Connection(Socket socket); 之所以這么做,就是為了把Socket參數(shù)傳給這個(gè)Connection對象,然后好讓Listener啟動這個(gè)Thread的時(shí)候,Thread可以知道他正在處理哪一個(gè)Socket。具體處理的方法:(在Listener的StartListening函數(shù),ocket connection = listener.Accept();之后)

 
 
 
  1. Connection gpsCn = new Connection(connection);
  2. //each socket will be wait for data. keep the connection.
  3. Thread thread = new Thread(new ThreadStart(gpsCn.WaitForSendData));
  4. thread.Name = connection.RemoteEndPoint.ToString();
  5. thread.Start();

3:Connection的會話處理
建立了新的Connection(也就是socket),遠(yuǎn)程就可以和這個(gè)socket進(jìn)行會話了,無非就是send和receive?,F(xiàn)在先看看怎么寫的這個(gè)線程運(yùn)行的Connection. WaitForSendData函數(shù)

 
 
 
  1. while (true)
  2. {
  3. bytes = new byte[1024];
  4. string data = "";
  5. //systm will be waiting the msg of receive envet. like Accept();
  6. //here will be suspended while waiting for socket income msg.
  7. int bytesRec = this._connection.Receive(bytes);
  8. _lastConnectTime = DateTime.Now;
  9. if (bytesRec == 0)//close envent
  10. {
  11. Logger.Log("Close Connection", _connection.RemoteEndPoint.ToString());
  12. break;
  13. }
  14. data += Encoding.ASCII.GetString(bytes, 0, bytesRec);
  15. //…….handle your data.
  16. }

可以看到這個(gè)處理的基本步驟如下:執(zhí)行Receive函數(shù),接收遠(yuǎn)程socket發(fā)送的信息;把信息從字節(jié)轉(zhuǎn)換到string;處理該信息,然后進(jìn)入下一個(gè)循環(huán),繼續(xù)等待C# Socket發(fā)送新的信息。

值得注意的有幾個(gè):
1:Receive函數(shù)。這個(gè)函數(shù)和Listener的Accept函數(shù)類似。在這個(gè)地方等待執(zhí)行,如果沒有新的消息,這個(gè)函數(shù)就不會執(zhí)行下一句,一直等待。
2:接收的是字節(jié)流,需要轉(zhuǎn)化成字符串
3:判斷遠(yuǎn)程關(guān)閉聯(lián)接的方式
4:如果對方的消息非常大,還得循環(huán)接收這個(gè)data。


文章名稱:C#Socket詳細(xì)剖析
標(biāo)題URL:http://www.dlmjj.cn/article/cdjjgie.html