Workerman作为客户端和服务器关闭连接后 怎么做到自动和服务器重连?

wuyuan

我想在客户端断开连接时重新和服务器建立连接。我在onClose里面这样写不行,要怎么写才对?
[attach]363[/attach]

阅读 5137
7个回答

walkor

在onClose时调用$con->connect()就可以重连了,不用重新new AyncTcpConnection。
注意:这个重连特性需要workerman版本>=3.3.4。

$con = new AsyncTcpConnection(...);
$con->onXXX=function...
// onClose时重连即可
$con->onClose=function($con) {
    $con->connect();
};
$con->connect();
  • 暂无评论
wuyuan

谢谢walkor!

  • 暂无评论
walkor

不客气

  • 暂无评论
wuyuan

@walkor 重新连接成功了,onConnect有东西输出,服务器端也收到消息,但是客户端没收到服务端发送的数据。正常情况下应该是一直循环发送数据和接收数据吧

[attach]364[/attach]

服务端接收的数据
[attach]365[/attach]

服务端代码
[attach]366[/attach]

  • 暂无评论
walkor

稍后我看下

  • 暂无评论
walkor

我知道问题了,
onClose里面不能用定时器调用$con->connect()重连,因为定时器是异步的,异步链接对象onClose时不立刻调用$con->connect()就会被workerman回收,异步链接的onMessage等回调都被回收了,所以没作用。

定时重连只能重新new AsyncTcpConnection了。
如果不需要定时重连,可以在onClose里面直接$con->connect()

  • pader 2016-08-26

    一般情况下,都不会 close 就立即重连吧,都会用定时器等个至少几秒。因为多数情况下由于服务端或者网络不稳定的断开,就算立即重连也多半是失败的。

pader

在 onClose 里面添加的定时器中,创建新的 $connection 时重连时需要把整个 onWorkerStart 里面创建 $connection 的部分都执行一遍。可以把 onMessage, onClose, onError 三个写成独立的函数,然后回调传入函数名称就行了。

  • 暂无评论