3 TCPServerService详细设计 图5 TCPServerService结构图 TCPServerService实现了IService接口和ITCPServerService接口。ITCPServerService的几个主要接口说明: 1) SendData 通过指定的ISocketItem发送数据, 数据在一般情况下由4个参数: MainCmd, SubCmd, Data, DataSize (可以参与总休设计中关于协议的部分的描述) 。有的时候Data为空,就不需要Data和DataSize这两个参数了。 2) SendDataBatch 给所有连接发送数据。这是批量发送的,所有连接池中对应的客户端都会收到。 3) CloseSocket 关闭指定的连接。 4) SetObserver 设置监听者。用以接收异步通知。 TCPServerService 管理着一个客户端来的连接池。这个连接池由SocketItem组成,每一个SocketItem都与一个整数标识对应,Applications使用这个标识来发送数据和接收数据。SocketItem主要提供下面几个接口: 1) GetIndex 获取与其对应的唯一标识 2) GetRound 由于每个SocketItem都是可以重用的,所以为了防止混乱,比如说一个SocketItem在前一时刻对应着client1, 但是现在对应着client2。client1曾经的一个请求现在才要返回,这时如果没有GetRound就会把client1的处理结果错误地返回给client2。从这里也可以看出,每个SocketItem的round是在连接建立的时候会增加。 3) IsConnected 是否处于连接状态。 4) SendData 发送数据。 5) GetClientAddress 得到客户端的IP地址 6) GetConnectTimer 获取连接时间。 7) Close 关闭连接。 也许你会问了,我怎么只看到发送数据的接口,而没有接收数据的接口呢?因为这是个异步架构,在有连接到来,或者数据到来的时候,你会收到通知的。前提条件是你调用SetObserver设置了监听者。TCPServerService的监听都需要实现ITCPServiceObserver接口, TCPServerService通过这个接口提供的方法来通知你连接和读取事件: 1) OnSocketAccept 在新连接到达时,会调用你这里面的内容。 2) OnSocketRead 在数据读取完成后,会调用你提供的这个方法做进一步处理。 3) OnSocketClose 告诉你连接将要关闭。 需要注意的是如果你这三个方法中有共享的数据,要加锁保护。因为工作线程可能会产生竞争状态。 和TimerService一样,TCPServerService的异步调度依赖于IAsyncService。
|