AsyncTcpConnection断线重连

akmao

ws客户端

AsyncTcpConnection断线,在onClose时候,通过$connection->reConnect(1),on connect触发: Sec-WebSocket-Accept not found。
目前糟糕的解决方案是:onClose时候,reload -g 重启进程。
期待更好的解答。

use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
require_once __DIR__ . '/Workerman/Autoloader.php';
$worker = new Worker();
// 进程启动时
$worker->onWorkerStart = function()
{
    // 以websocket协议连接远程websocket服务器
    $ws_connection = new AsyncTcpConnection("ws://echo.websocket.org:80");
    // 连上后发送hello字符串
    $ws_connection->onConnect = function($connection){
              for($i=0;$i<100;$i++) {
                   $connection->send('hello');
              }
    };
    // 远程websocket服务器发来消息时
    $ws_connection->onMessage = function($connection, $data){
        echo "recv: $data\n";
    };
    // 连接上发生错误时,一般是连接远程websocket服务器失败错误
    $ws_connection->onError = function($connection, $code, $msg){
        echo "error: $msg\n";
    };
    // 当连接远程websocket服务器的连接断开时
    $ws_connection->onClose = function($connection){
        echo "connection closed\n";
        $connection->reConnect(1);     //**_首次实例化connect无问题,重连触发==Sec-WebSocket-Accept not found.**_
    };
    // 设置好以上各种回调后,执行连接操作
    $ws_connection->connect();
};
Worker::runAll();
阅读 1694
2个回答

maq

onConnect 的时候,WebSocket 握手尚未完成,不要在这里发送数据。应用层的通信应该在 onWebSocketConnect 之后才能开始。

  • akmao 2018-05-07

    把workerman作为Websocket客户端,AsyncTcpConnection可以让Workerman作为客户端向远程服务端发起异步连接,并通过send接口和onMessage回调异步发送和处理连接上的数据。针对您所说的,对比官方示例http://doc3.workerman.net/worker-development/__construct.html;然后自测了一下,问题还是存在。

walkor

测试了下这个脚本,没发现所说的Sec-WebSocket-Accept not found问题

  • akmao 2018-05-07

    我在onConnect里面,调用循环订阅多个ch, 有多个$connection->send(),难道是这个影响了?

  • akmao 2018-05-07

    脚本已经更新

  • walkor 2018-05-07

    更新的脚本出现很多未定义变量,脚本请先自行测试下能否重现你的问题再贴出来吧,这样大家都节省时间,也是对其它想帮助你的人的一种尊重。

  • akmao 2018-05-07

    @1:里面其实就是一个循环,订阅了N多频道