请教下ping的问题

fqfisher

你好,现在做的项目使用上了GatewayWorker框架,与客户端(网页,pad,windows客户端)做消息通讯,现在遇到一个问题是保活相关的。C++或者Java那边使用的第三方库,自带保活机制,会定时给服务端发ping消息来检测检测是否保持连接状态,但是抓包的结果显示opcode码为0x09,服务端在onmessage监听不到消息,导致我们服务端的一段时间过后就断开连接,保活失败,请问有没有办法监听或者兼容该情况?

$gateway = new Gateway("websocket://0.0.0.0:8384");
// gateway名称,status方便查看
$gateway->name = 'YourAppGatewayWS';
// gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 
$gateway->startPort = 4000;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1237';

// 心跳间隔
$gateway->pingInterval = 10;
// 心跳数据
//$gateway->pingData = '{"type":"ping"}';
$gateway->pingData = '';

$gateway->pingNotResponseLimit = 2;

目前为了兼容这种情况是让客户端发送text消息来做保活,请问有没有其他的方法呢?

阅读 2854
2个回答

walkor

Workerman Websocket协议类会在客户端发送ping后自动返回pong。

代码在
https://github.com/walkor/Workerman/blob/master/Protocols/Websocket.php#L116

  • fqfisher 2017-06-19

    嗯,这块代码有看到过,但是文档上建议的心跳检测配置客户端保活的方法是客户端再加个文本消息定时发送给服务端,这样服务端才能检测到客户端的存在,有没有办法直接识别客户端的0x09的opcode消息来实现心跳检测?不知道我有没有理解错误,请指教!

walkor

start_gateway.php里加一句

$gateway->onWebSocketPing = function($connection) {
        $connection->pingNotResponseCount = -1;
};

试下

  • niu5100201 2019-10-24

    加上这段代码后pong帧直接不返回了

  • wuxuhuasc 2020-03-20

    $gateway->onWebSocketPing = function($connection) {
    $connection->pingNotResponseCount = -1;
    $connection->send('pong');
    };