我最近需要為一個.net項目準備一個內部線程通信機制. 項目有多個使用asp.net,Windows 表單和控制臺應用程序的服務器和客戶端構成. 考慮到實現的可能性,我下定決心要使用原生的socket,而不是許多.NET中已經提前為我們構建好的組件, 像是所謂的管道, NetTcpClient 還有 Azure 服務總線.
這篇文章中的服務器基于System.Net.Sockets類異步方法. 這些允許你支持大量的socket客戶端, 而一個客戶端的連接是唯一的阻塞機制. 阻塞的時間是可以忽略不記得,所以服務器基本上是在當做一個多線程socket服務器在運作的.
原生的socket在為你提供通信層面的完全控制權上具有優勢, 而在處理不同的數據類型是具有很大的靈活性. 你甚至可以通過socket發送序列化了的CLR對象,盡管我在這里不會那樣做. 這個項目將會想你展示如何在socket之間發送文本.
使用下面的代碼,你初始化了一個Server類,并運行了Start()方法:
1 | ServermyServer=newServer(); |
2 | myServer.Start(); |
如果你計劃在一個Windows表單中管理服務器的話,我建議使用一個BackgroundWorker, 因為socket方法(一般會是ManualResentEvent) 將會阻塞GUI線程的運行.
Server 類:
01 | usingSystem.Net.Sockets; |
02 |
03 | publicclassServer |
04 | { |
05 | PRivatestaticSocketlistener; |
06 | publicstaticManualResetEventallDone=newManualResetEvent(false); |
07 | publicconstint_bufferSize=1024; |
08 | publicconstint_port=50000; |
09 | publicstaticbool_isRunning=true; |
10 |
11 | classStateObject |
12 | { |
13 | publicSocketworkSocket=null; |
14 | publicbyte[]buffer=newbyte[bufferSize]; |
15 | publicStringBuildersb=newStringBuilder(); |
16 | } |
17 |
18 | //Returnsthestringbetweenstr1andstr2 |
19 | staticstringBetween(stringstr,stringstr1,stringstr2) |
20 | { |
21 | inti1=0,i2=0; |
22 | stringrtn=""; |
23 |
24 | i1=str.IndexOf(str1,StringComparison.InvariantCultureIgnoreCase); |
25 | if(i1>-1) |
26 | { |
27 | i2=str.IndexOf(str2,i1+1,StringComparison.InvariantCultureIgnoreCase); |
28 | if(i2>-1) |
29 | { |
30 | rtn=str.Substring(i1+str1.Length,i2-i1-str1.Length); |
31 | } |
32 | } |
33 | returnrtn; |
34 | 學習交流
熱門圖片
猜你喜歡的新聞
猜你喜歡的關注
新聞熱點 2021-11-16 21:31:39
2021-11-02 13:59:17
2021-11-02 13:52:17
2021-11-01 13:36:51
2021-11-01 13:34:27
2021-11-01 12:56:36
疑難解答 |