我最近需要为一个.net项目准备一个内部线程通信机制. 项目有多个使用asp.net,Windows 表单和控制台应用程序的服务器和客户端构成. 考虑到实现的可能性,我下定决心要使用原生的socket,而不是许多.NET中已经提前为我们构建好的组件, 像是所谓的管道, NetTcpClient 还有 Azure 服务总线.
这篇文章中的服务器基于System.Net.Sockets类异步方法. 这些允许你支持大量的socket客户端, 而一个客户端的连接是唯一的阻塞机制. 阻塞的时间是可以忽略不记得,所以服务器基本上是在当做一个多线程socket服务器在运作的.
原生的socket在为你提供通信层面的完全控制权上具有优势, 而在处理不同的数据类型是具有很大的灵活性. 你甚至可以通过socket发送序列化了的CLR对象,尽管我在这里不会那样做. 这个项目将会想你展示如何在socket之间发送文本.
使用下面的代码,你初始化了一个Server类,并运行了Start()方法:
1 | ServermyServer= new Server(); |
2 | myServer.Start(); |
如果你计划在一个Windows表单中管理服务器的话,我建议使用一个BackgroundWorker, 因为socket方法(一般会是ManualResentEvent) 将会阻塞GUI线程的运行.
Server 类:
01 | usingSystem.Net.Sockets; |
02 |
03 | public class Server |
04 | { |
05 |
PRivate static Socketlistener; |
06 |
public static ManualResetEventallDone= new ManualResetEvent( false ); |
07 |
public const int _bufferSize= 1024 ; |
08 |
public const int _port= 50000 ; |
09 |
public static bool_isRunning= true ; |
10 |
11 |
class StateObject |
12 |
{ |
13 |
public SocketworkSocket= null ; |
14 |
public byte []buffer= new byte [bufferSize]; |
15 |
public StringBuildersb= new StringBuilder(); |
16 |
} |
17 |
18 |
//Returnsthestringbetweenstr1andstr2 |
19 |
static stringBetween(stringstr,stringstr1,stringstr2) |
20 |
{ |
21 |
int i1= 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 |
return rtn; |
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
疑难解答 |