tcp和websocket协议同时存在时,tcp发送数据后会把websocket用户给踢掉,求解

追梦随想

问题描述

目前在做一个物联网系统,demo的Gateway用来做设备的tcp连接,

$gateway = new Gateway("tcp://0.0.0.0:8282");
$gateway->startPort = 2900;

又新建了一个websocket的Gateway用来做网页的连接

$gateway = new Gateway("websocket://0.0.0.0:1234");
$gateway->startPort = 3000;

然后用网页连接了websocket端口,用tcp测试工具连接了tcp端口,当其中一个终端发消息时其他终端都可以收到消息,这是没问题的,但是tcp端发送消息后会把websocket端口所有用户踢掉线,试了几次都是如此。

目前是测试domo,基本上没有太多的改动,所以不是代码的问题,这究竟是为什么?
测试环境windows10 64位

为此你搜索到了哪些方案及不适用的原因

暂时没找到同样的问题。

524 3 0
3个回答

Gin

怀疑是 websocket 接收到消息了, 处理过程报错, 导致掉线了

  • 追梦随想 2023-05-11

    网页端没有收到消息,直接掉线,代码还是下载的demo,啥也没改

        /**
         * 当客户端连接时触发
         * 如果业务不需此回调可以删除onConnect
         * 
         * @param int $client_id 连接id
         */
        public static function onConnect($client_id)
        {
            // 向当前client_id发送数据 
            Gateway::sendToClient($client_id, "Hello $client_id\r\n");
            // 向所有人发送
            Gateway::sendToAll("$client_id login\r\n");
        }
    
       /**
        * 当客户端发来消息时触发
        * @param int $client_id 连接id
        * @param mixed $message 具体消息
        */
       public static function onMessage($client_id, $message)
       {
            // 向所有人发送 
            Gateway::sendToAll("$client_id said $message\r\n");
       }
    
       /**
        * 当用户断开连接时触发
        * @param int $client_id 连接id
        */
       public static function onClose($client_id)
       {
           // 向所有人发送 
           GateWay::sendToAll("$client_id logout\r\n");
       }
  • Gin 2023-05-11

    websocket 业务代码看下

  • 追梦随想 2023-05-11
    <?php
    
    /**
     * websocket 请求网关
     */
    
    use \Workerman\Worker;
    use \Workerman\WebServer;
    use \GatewayWorker\Gateway;
    use \GatewayWorker\BusinessWorker;
    use \Workerman\Autoloader;
    
    // 自动加载类
    require_once __DIR__ . '/../../vendor/autoload.php';
    
    // gateway 进程,这里使用Text协议,可以用telnet测试
    $gateway = new Gateway("websocket://0.0.0.0:1234");
    
    // gateway名称,status方便查看
    $gateway->name = 'websocketGateway';
    // gateway进程数
    $gateway->count = 4;
    // 本机ip,分布式部署时使用内网ip
    $gateway->lanIp = '127.0.0.1';
    // 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
    // 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
    $gateway->startPort = 3000;
    // 服务注册地址
    $gateway->registerAddress = '127.0.0.1:1238';
    
    // 心跳间隔
    // $gateway->pingInterval = 40;
    
    // 连续几次没有心跳则断开连接
    // $gateway->pingNotResponseLimit = 1;
    
    // 如果不是在根目录启动,则运行runAll方法
    if(!defined('GLOBAL_START'))
    {
        Worker::runAll();
    }
    
walkor

因为看到乱码了,可能编码问题。websocket通讯必须是utf8编码,你的这个tcp客户端发的消息可能不是utf8编码。

  • Gin 2023-05-11

    一发中文就掉 编码的问题

  • 追梦随想 2023-05-11

    好的,感谢,经过测试确实是编码问题,如果发送数字和字母不会出现掉线情况,这是个TCP测试工具带来的问题

Gin
  • 追梦随想 2023-05-11

    感谢,如果发送数字和字母不会出现掉线情况,这是个TCP测试工具带来的问题

  • 追梦随想 2023-05-11

    经过测试确实是编码问题

🔝