recv data before handshake. Buffer 这是什么情况咧,找了半天没找到原因,求帮助。

zoofei
$client = new AsyncTcpConnection('ws://xxx.com:80');
$client->onConnect = function($con) {
            $rid = time();
            $lang = "kor";
            $con->send('xxx');
};
$client->onMessage = function($con, $data) use($ids,$orates,$client) {
....
}
$client->connect();

代码如上,日志隔三差五就报下面错误,找不到有原因,求帮助...
recv data before handshake. Buffer:890c31303a34333a35332e373833
error package. package_length=false

6534 4 0
4个回答

walkor

检查下代码里是否有 new Worker('ws://...') 或者 new Gateway('ws://...'),
改成 new Worker('websocket://...') 或者 new Gateway('websocket://...'),

  • 暂无评论
zoofei

感谢walkor回复
代码没有new ws://,
代码整体启动了
Gateway('Websocket://0.0.0.0:7272'),
Register('text://0.0.0.0:1236');
BusinessWorker();
然后单独在开个new Worker();做定时任务。

Timer::add($this->sec, array($this,'refresh'));
function refresh(){
    $client = new AsyncTcpConnection('ws://xxx:80');
    echo "start connect id:".$client->id;
    因为远端经常掉线或者踢人,所以没有保持长连接,每次定时开始都重新new一个连接,获取数据后立即destory,就是这个异步链接经常报错:

    start connet id:48
    connect id:48 buffer:05:37:00.426 recv data before handshake. Buffer:890c30353a33373a30302e343236
    error package. package_length=false
}
/*
* Websocket protocol for client.
*/
Class Ws{
    public static function input($buffer, $connection)
    {
        if (empty($connection->handshakeStep)) {
            echo "connect id:".$connection->id."  buffer".$buffer;
            echo "recv data before handshake. Buffer:" . bin2hex($buffer) . "\n";
            return false;
        }
}
  • 暂无评论
walkor

看起来是服务端没有按照websocket协议来传输数据,还没有完成websocket握手,服务端就发来了websocket数据。
正常流程是先发起websocket握手,然后传输数据。

  • 暂无评论
zoofei

过年之前我就一直开着服务,年后回来一看,服务死掉了,有大量这种错误,开始以为就是这里搞死服务的,那现在看起来应该不是,远端没有握手,destory掉就是了,应该不影响进程,搞不清是哪里死掉了,在看看日志吧,感谢回复

  • 暂无评论
年代过于久远,无法发表回答
🔝