Net有道

紫冠道人的求道历程

导航

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个),所以在这次开发中我就用了一些简单的方法来管理客户端的连接。

由于这一块并没有经过认真的设计,也暂时无力作认真的设计,最后实现的东西自己也不满意,这里就不去讲述如何实现管理连接的了。

posted on 2007-07-30 09:40  lichdr  阅读(794)  评论(1编辑  收藏  举报