我最近需要为一个.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
疑难解答 |