我想在客户端断开连接时重新和服务器建立连接。我在onClose里面这样写不行,要怎么写才对? [attach]363[/attach]
在onClose时调用$con->connect()就可以重连了,不用重新new AyncTcpConnection。 注意:这个重连特性需要workerman版本>=3.3.4。
$con = new AsyncTcpConnection(...); $con->onXXX=function... // onClose时重连即可 $con->onClose=function($con) { $con->connect(); }; $con->connect();
谢谢walkor!
不客气
@walkor 重新连接成功了,onConnect有东西输出,服务器端也收到消息,但是客户端没收到服务端发送的数据。正常情况下应该是一直循环发送数据和接收数据吧
[attach]364[/attach]
服务端接收的数据 [attach]365[/attach]
服务端代码 [attach]366[/attach]
稍后我看下
我知道问题了, onClose里面不能用定时器调用$con->connect()重连,因为定时器是异步的,异步链接对象onClose时不立刻调用$con->connect()就会被workerman回收,异步链接的onMessage等回调都被回收了,所以没作用。
定时重连只能重新new AsyncTcpConnection了。 如果不需要定时重连,可以在onClose里面直接$con->connect()
一般情况下,都不会 close 就立即重连吧,都会用定时器等个至少几秒。因为多数情况下由于服务端或者网络不稳定的断开,就算立即重连也多半是失败的。
在 onClose 里面添加的定时器中,创建新的 $connection 时重连时需要把整个 onWorkerStart 里面创建 $connection 的部分都执行一遍。可以把 onMessage, onClose, onError 三个写成独立的函数,然后回调传入函数名称就行了。
在onClose时调用$con->connect()就可以重连了,不用重新new AyncTcpConnection。
注意:这个重连特性需要workerman版本>=3.3.4。
谢谢walkor!
不客气
@walkor 重新连接成功了,onConnect有东西输出,服务器端也收到消息,但是客户端没收到服务端发送的数据。正常情况下应该是一直循环发送数据和接收数据吧
[attach]364[/attach]
服务端接收的数据
[attach]365[/attach]
服务端代码
[attach]366[/attach]
稍后我看下
我知道问题了,
onClose里面不能用定时器调用$con->connect()重连,因为定时器是异步的,异步链接对象onClose时不立刻调用$con->connect()就会被workerman回收,异步链接的onMessage等回调都被回收了,所以没作用。
定时重连只能重新new AsyncTcpConnection了。
如果不需要定时重连,可以在onClose里面直接$con->connect()
一般情况下,都不会 close 就立即重连吧,都会用定时器等个至少几秒。因为多数情况下由于服务端或者网络不稳定的断开,就算立即重连也多半是失败的。
在 onClose 里面添加的定时器中,创建新的 $connection 时重连时需要把整个 onWorkerStart 里面创建 $connection 的部分都执行一遍。可以把 onMessage, onClose, onError 三个写成独立的函数,然后回调传入函数名称就行了。