ws 客户端与tcp客户端进行通信,消息乱码导致websocket 连接断开(已解决)

软饭工程师

我需要实现一个功能,实现websocket 客户端与tcp 客户端进行通信,目前ws 客户端与 tcp客户端双向通信 已经实现,但是tcp 客户端发送消息给ws客户端 里包含中文时会失败,导致ws 连接断开

我的实现方案是
1,启动一个ws 服务器 websocketServer,启动一个tcp 服务器tcpServer
2, ws 客户端发送消息给websocketServer,websocketServer 收到消息后,使用 AsyncTcpConnection 将消息发送给 tcpServer,tcpServer 将消息发送给tcp 客户端
tcp 发送消息给websocket 也是一样的操作

websocketServer 实现

$worker = new Worker('websocket://0.0.0.0:2345');

$worker->onWorkerStart = function ($worker) {
    //子进程启动后,建立tcp客户端,
    $tcpConnection = new AsyncTcpConnection('tcp://127.0.0.1:2347');
    $tcpConnection->connect();
    $worker->tcpConnection = $tcpConnection;
};

$worker->onMessage = function (TcpConnection $connection, $data) use ($worker) {
    //不回复来自tcp的消息
    if ($connection->getRemoteIp() != '127.0.0.1') {
        $worker->tcpConnection->send($data);
    }
    foreach ($worker->connections as $websocket_con) {
         //发给ws 客户端和tcp 客户端
        $websocket_con->send($data);
    }
};

tcpServer 实现

$tcpWorker = new Worker("tcp://0.0.0.0:2347");

$tcpWorker->onWorkerStart = function ($worker) {
    //子进程启动后,建立ws客户端,
    $wsConnection = new AsyncTcpConnection('ws://127.0.0.1:2345');
    $wsConnection->connect();
    $worker->wsConnection = $wsConnection;
};

$tcpWorker->onMessage = function ($connection, $data) use ($tcpWorker) {
    if ($connection->getRemoteIp() != '127.0.0.1') {
        $tcpWorker->wsConnection->send($data);
    }
    foreach ($tcpWorker->connections as $websocket_con) {
        //发给ws 客户端和tcp 客户端
        $websocket_con->send($data);
    }
};

已经实现的效果截图

截图

截图报错信息

截图
wsServer onMessage 打印tcp 发送的消息,发现乱码
截图
使用wscat 测试,出现报错信息
截图
请问这个问题应该怎么解决

181 1 0
1个回答

latin

发中文断开的话应该是你tcp客户端发送的不是utf8编码的文字

  • 软饭工程师 2024-05-17

    解决了,是这个tcp 客户端的问题,谢谢了,我在onMessage 里面打印传过来的字符串的编码,显示utf8,但是字符串乱码,我换了个tcp 客户端工具就好了

🔝