在自己的tcp服务和第三方tcp服务器建立长连接

liong

问题描述

tcp服务器A(在自己这边)
tcp服务器B(在第三方)

1.设备和tcp服务器A()建立长连接成功,然后需要和tcp服务器B建立长连接;
2.设备发送给tcp服务器A的数据,需转发给tcp服务器B
3.tcp服务器B发送设备的数据,先发送tcp服务器A,tcp服务器A再发设备
设备和tcp服务器A()建立长连接和互发数据是成的
困难:怎么和tcp服务器b建立长连接,没有思路

想要实现:设备上线,tcp服务器A上线,tcp服务器B上线
tcp服务器B发送数据给tcp服务器A,tcp服务器A能把数据发送给设备
设备发送数据给tcp服务器A,tcp服务器A把数据发送给tcp服务器B

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

目前是在laravel里用GatewayWorker实现和设备的长连接和互发数据

不局限框架,准备把这个服务单独部署.
请各位大佬不吝赐教

342 1 0
1个回答

walkor

你这个类似代理,如果与B只建立一个连接参考这个
https://www.workerman.net/doc/workerman/async-tcp-connection/reconnect.html
如果每个客户端连接到A后都需要与B建立一个连接,参考
https://www.workerman.net/doc/workerman/async-tcp-connection/construct.html
https://www.workerman.net/doc/workerman/tcp-connection/pipe.html

以上用法gatewayWorker里也可以用,也就是在Events.php的onWorkerStart onConnect 里使用 AsyncTcpConnection

  • liong 2024-01-05

    非常感谢,每个客户端连接到a后都需要与b建立连接

  • liong 2024-01-10

    我用的是这个https://www.workerman.net/doc/workerman/tcp-connection/pipe.html
    其中有个代码是$connection->pipe($connection_to_80);
    下面是我的代码
    class Events
    {

    public static function onWorkerStart($businessWorker){
    
        Log::info('启动服务');
    }
    public static function onConnect($client_id){
        $connection_to_three = new AsyncTcpConnection('tcp://0.0.0.0:3000');
        // 设置将当前客户端连接的数据导向第三方的连接
    
        /*
        1 public static function onConnect($client_id,TcpConnection $connection) 在这里引入报错,多了参数
        2 $connection = new TcpConnection(); 这样写报错:需要参数
        3 $connection = new TcpConnection(connection_to_three); 这样写报错:需要的是resource,不是obj
        如何在这个方法里使用 TcpConnection $connection
        */ 
    
        $connection->pipe($connection_to_three);
    
        // 设置80端口连接返回的数据导向客户端连接
        $connection_to_three->pipe($connection);
        // 执行异步连接
        $connection_to_three->connect();
        Log::info('连接成功-' . $client_id);
    
    }
    public static function onWebSocketConnect($client_id, $data){
        Log::info('onWebSocketConnect' . $client_id);
    }
    public static function onMessage($client_id, $message){
    
        Log::info('收到消息-' .$message.'-'. $client_id);
        Gateway::sendToClient($client_id,$message.'3000');
    }
    
    public static function onClose($client_id){
        Log::info('断开连接-' . $client_id);
    }

    }

🔝