找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4839|回复: 3

Reactor and Proactor process reconnect

[复制链接]
发表于 2008-9-9 19:10:14 | 显示全部楼层 |阅读模式
当客户端重新连接的时候,对于Reactor 和Proactor怎样处理新的连接,是不是生成新的Event Handler实例或是Complete Handler实例?
那么原有的实例怎样处理?删除还是保留?处理数据状态是否保留??
 楼主| 发表于 2008-9-9 19:10:20 | 显示全部楼层
这个问题,是这样,依赖于你的实现,ACE的灵活性就体现在这个地方。

如果在handle_close的时候,你删除了处理器,那么当然要在重新连接的时候重新创建处理器。
如果你缓冲使用了处理器,那么你需要重置处理器的内部处理状态,再次使用。TCP不关心你是否已经连接过,只要是断开后连接,一视同仁,视为新TCP连接。
 楼主| 发表于 2008-9-9 19:10:29 | 显示全部楼层
还不是很清晰。

这样,我描述一个场景,然后看一看应该怎样设计和实现。

比如server端使用Reactor模式。我的处理器Client_Service只是简单的把每个客户端的发送过来的文件数据写到本地磁盘上,并且每个客户端对应的文件名称和路径不相同。

开始,比如有三个客户端连接过来,生成三个Client_Service实例,每个实例对象都在写文件,这时,其中一个客户端由于网络原因断开了,客户端马上重新连接,一段时间后,比如3秒,网络恢复,那么客户端连接成功,继续发送文件,而不是重新发送文件。

那么server端应该怎样处理?
 楼主| 发表于 2008-9-9 19:10:37 | 显示全部楼层
这个问题很简单。首先你必须能够识别你的客户端和文件,必须有IP、文件的对应关系。
你的服务器端,在客户端连接的时候,能够知道它上次是否已经发过部分数据了,如果是新的就直接发送,如果是续传,就继续写入旧的文件。没有自定义协议的支持,光靠TCP自身,解决起来很麻烦,因为难以有对应关系存在。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-21 21:36 , Processed in 0.018631 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表