C# 实现的异步 Socket 服务器

8/3/2015来源:C#应用人气:2184

C# 实现的异步 Socket 服务器

介绍

我最近需要为一个.net项目准备一个内部线程通信机制. 项目有多个使用asp.net,Windows 表单和控制台应用程序的服务器和客户端构成. 考虑到实现的可能性,我下定决心要使用原生的socket,而不是许多.NET中已经提前为我们构建好的组件, 像是所谓的管道, NetTcpClient 还有 Azure 服务总线.

这篇文章中的服务器基于System.Net.Sockets类异步方法. 这些允许你支持大量的socket客户端, 而一个客户端的连接是唯一的阻塞机制. 阻塞的时间是可以忽略不记得,所以服务器基本上是在当做一个多线程socket服务器在运作的.

背景

原生的socket在为你提供通信层面的完全控制权上具有优势, 而在处理不同的数据类型是具有很大的灵活性. 你甚至可以通过socket发送序列化了的CLR对象,尽管我在这里不会那样做. 这个项目将会想你展示如何在socket之间发送文本.

代码的运用

使用下面的代码,你初始化了一个Server类,并运行了Start()方法:

1ServermyServer=newServer();
2myServer.Start();

如果你计划在一个Windows表单中管理服务器的话,我建议使用一个BackgroundWorker, 因为socket方法(一般会是ManualResentEvent) 将会阻塞GUI线程的运行.

Server 类:

01usingSystem.Net.Sockets;
02
03publicclassServer
04{
05PRivatestaticSocketlistener;
06publicstaticManualResetEventallDone=newManualResetEvent(false);
07publicconstint_bufferSize=1024;
08publicconstint_port=50000;
09publicstaticbool_isRunning=true;
10
11classStateObject
12{
13publicSocketworkSocket=null;
14publicbyte[]buffer=newbyte[bufferSize];
15publicStringBuildersb=newStringBuilder();
16}
17
18//Returnsthestringbetweenstr1andstr2
19staticstringBetween(stringstr,stringstr1,stringstr2)
20{
21inti1=0,i2=0;
22stringrtn="";
23
24i1=str.IndexOf(str1,StringComparison.InvariantCultureIgnoreCase);
25if(i1>-1)
26{
27i2=str.IndexOf(str2,i1+1,StringComparison.InvariantCultureIgnoreCase);
28if(i2>-1)
29{
30rtn=str.Substring(i1+str1.Length,i2-i1-str1.Length);
31}
32}
33returnrtn;
34