RFID会议签到系统总结(二十一)――服务端的通讯
这一篇其实没什么可讲的,只提一下跟客户端不太一样的一些地方。
服务端跟客户端最大的区别是它面对的不是单单一个连接,而是有一些个连接。对于接收与发送来讲它是要具体到accept进来的每一个连接的,所以这里有一个SocketStateObject参数会贯穿始终,这个参数主要就是放对应客户端的Socket连接及一些状态变量,在accept进来一个连接后即创建一个这个对象。
public void Listen(int port)
{
IPEndPoint ipe = new IPEndPoint(IPAddress.Any,port);
workSock = new Socket(ipe.AddressFamily,SocketType.Stream,ProtocolType.Tcp);
workSock.Bind(ipe);
workSock.Listen(100);
acpT = new Thread(new ThreadStart(acceptThread));
acpT.IsBackground = true;
acpT.Start();
}
private void acceptThread()
{
while(true)
{
Socket asock = workSock.Accept();
SocketStateObject state = new SocketStateObject(asock);
if (OnConnect != null)
OnConnect(state,System.EventArgs.Empty);
ThreadPool.QueueUserWorkItem(new WaitCallback(ReceiveThreadEntryPoint),state);
}
}
象上面OnConnect事件及ReceiveThreadEntryPoint方法里都会跟进这么一个参数。
管理连接是个很复杂、很讲究技术的活。可用连接的数据接收与发送(甚至有些接收与发送必须是相关的)、连接的可用性监测、失效连接的移除。所有这些都要作应有的记录,并且一些还要往UI界面触发事件,事件触发这一点至关重要,也最为棘手,这其中涉及到很多线程同步、线程阻塞的问题。
对于这种极为复杂的问题,最好的解决方法是参照现有的成熟方案进行设计、实现或者拿来主义。但之前也没涉足到这些方面的开发,一时还真找不到比较理想的东西,加之项目本身对于通讯的要求不甚高,10个连接顶天了(如果真有哪个客户要10个签到终端,那真是绝对的上帝了,至目前为止最多的也就5个终端,一般不会多于3个),所以在这次开发中我就用了一些简单的方法来管理客户端的连接。
由于这一块并没有经过认真的设计,也暂时无力作认真的设计,最后实现的东西自己也不满意,这里就不去讲述如何实现管理连接的了。