GatewayWorker没有触发连接onConnect回调

shaonian820

这是回调onConnect代码
图片
---------这是配置代码------------

$gateway = new Gateway("websocket://0.0.0.0:8331");

$gateway->name = 'YourAppGateway';

$gateway->count = 4;

$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口 
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1238';

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

/* 
// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
$gateway->onConnect = function($connection)
{
    $connection->onWebSocketConnect = function($connection , $http_header)
    {
        // 可以在这里判断连接来源是否合法,不合法就关掉连接
        // $_SERVER标识来自哪个站点的页面发起的websocket链接
        if($_SERVER != 'http://kedou.workerman.net')
        {
            $connection->close();
        }
        // onWebSocketConnect 里面$_GET $_SERVER是可用的
        // var_dump($_GET, $_SERVER);
    };
}; 
*/
/*$gateway->onConnect = function($connection)
{
    $connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
}; */

// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START'))
{
    Worker::runAll();
}

------前端代码--------

图片
当我在前端控制台输出ws的时候会出现这种情况

图片

4394 2 0
2个回答

phpcreeper

1、console.log(ws) 输出是正常的,第一个红框 readyState: 0 代表的是websocket初始化时未连接状态,第二个红框readyState: 1代表 websocket 状态已经发生改变,即已经和服务端成功建立连接。
2、代码看上去也没有发现有什么异常,同样的代码,我运行了一遍,工作OK。
3、更改了Events.php? 记得重启~~

  • shaonian820 2018-12-22

    更改了Events.php 重启了 但是有时候就是刷新页面的时候 连接建立起来之后没有触发onConnect回调函数 偶尔会出现这种情况
    我觉得可能是就是说如果浏览器不关闭的话 那么在刷新页面的时候连接也不会断开 所以没有触发onConnect回调,会有这个可能吗?

  • phpcreeper 2018-12-22

    @5202: 在浏览器不关闭的场景下:若刷新页面会重新建立连接;若不刷新页面,连接也可能会断开,因为防火墙会干掉一定时间内不活跃的连接,所以长连接应用必须加心跳。

  • shaonian820 2018-12-24

    @614:好的 多谢大佬 就是在本地环境会出现这种情况 然后我必须重启websocket 然后刷新页面 才可以解决,在线上偶尔会出现这种问题 一直找不到原因。
    呃 我是把一个建立了连接的页面一直放着然后有个js定时器一直给websocket发送消息,接着我把建立了连接的页面放了一段时间之后,我就按F5刷新了一下页面 这时候就触发不了onConnect回调了

  • shaonian820 2018-12-24

    @614:我目前找到的问题好像是客户端在连接服务器的时候连接没有建立成功或者说没连接上才会出现这种情况,但是现在就是找不到为啥有时候会出现看客户端连接服务器的时候 连接建立不成功呢?

  • shaonian820 2018-12-24

    @614:而且这时候我查看http连接的话 返回的状态码却是101是没问题的

  • shaonian820 2018-12-24

    我在想会不会是缓存问题?如果说页面做了缓存 第一次访问的时候没有缓存所以连接建立成功 但是第二次刷新页面的时候访问的时候有了缓存从而连接建立不成功 这时候页面也不报错?

  • phpcreeper 2018-12-24

    @5202:不应该是缓存的问题,刷新页面之后,之前的js对象比如ws对象已经销毁了。

  • phpcreeper 2018-12-24

    @5202: 另外你浏览器每次是在什么条件下发起的 new websocket 连接?

  • shaonian820 2018-12-24

    @614:我用的是谷歌浏览器 开启无痕模式进行访问了 然后js是直接写了个<script type="text/javascript"></script>标签里面写接着定义几个函数 然后就
    ws = new WebSocket("wss://"+document.domain+"/wss");
    console.log(ws);
    // 服务端主动推送消息时会触发这里的onmessage
    ws.onmessage = function(e){
    var data = JSON.parse(e.data);
    console.log(data);
    }

  • shaonian820 2018-12-24

    @614:这时候我查看长连接返回的状态是101没问题但是既不触发onConnect回调函数 然后我再控制台打印输出了一下ws.readyState却发现值为0

  • shaonian820 2018-12-24

    @614:想不通问题会出在哪儿 若是连接有问题那应该会直接报错 不能出现这种有时候连接不上有时候又连接得上的问题

  • 同一个梦 2019-12-07

    @5202:你这个问题解决了吗。我也遇见

shaonian820

这分别是我连接上和连接不上在控制台查看ws的截图:
连接上触发onConnect回调:

[attach]1599[/attach]

 
 
连接不上未触发onConnect回调还有http状态码:

[attach]1598[/attach]

[attach]1597[/attach]

 

  • phpcreeper 2018-12-25

    1、ws.readyState是在onXXX回调之外打印的吧? 如果是的话,ws.readyState = 0 就没疑问了;换句话在onXXX回调中打印,应该已经是 ws.readyState = 1。
    2、根据http响应状态码101,也能充分说明 websocket 已经成功建立连接,也就说明tcp的三次握手也早已成功了,而服务端的onConnect 是三次握手成功后触发的。

  • shaonian820 2018-12-25

    明白了 就是我再刷新页面的时候连接并没有断开 所以才会出现这种情况是吗?但是有点不清楚的地方就是说 为什么连接会在有时候刷新页面的时候不断开呢?

年代过于久远,无法发表回答
×
🔝