Reactor and Proactor process reconnect
当客户端重新连接的时候,对于Reactor 和Proactor怎样处理新的连接,是不是生成新的Event Handler实例或是Complete Handler实例?那么原有的实例怎样处理?删除还是保留?处理数据状态是否保留?? 这个问题,是这样,依赖于你的实现,ACE的灵活性就体现在这个地方。
如果在handle_close的时候,你删除了处理器,那么当然要在重新连接的时候重新创建处理器。
如果你缓冲使用了处理器,那么你需要重置处理器的内部处理状态,再次使用。TCP不关心你是否已经连接过,只要是断开后连接,一视同仁,视为新TCP连接。 还不是很清晰。
这样,我描述一个场景,然后看一看应该怎样设计和实现。
比如server端使用Reactor模式。我的处理器Client_Service只是简单的把每个客户端的发送过来的文件数据写到本地磁盘上,并且每个客户端对应的文件名称和路径不相同。
开始,比如有三个客户端连接过来,生成三个Client_Service实例,每个实例对象都在写文件,这时,其中一个客户端由于网络原因断开了,客户端马上重新连接,一段时间后,比如3秒,网络恢复,那么客户端连接成功,继续发送文件,而不是重新发送文件。
那么server端应该怎样处理? 这个问题很简单。首先你必须能够识别你的客户端和文件,必须有IP、文件的对应关系。
你的服务器端,在客户端连接的时候,能够知道它上次是否已经发过部分数据了,如果是新的就直接发送,如果是续传,就继续写入旧的文件。没有自定义协议的支持,光靠TCP自身,解决起来很麻烦,因为难以有对应关系存在。
页:
[1]