Search code examples
phpsocketswebsocketratchetreactphp

PHP read data from raw tcp socket and send them through WebSocket Client using 2 React Connector


Here what i'm trying to do :

(Socket Server:9006) <- (Websocket Client) -> (:8080 Websocket Server)

I want to read data from Socket Server, edit some stuff and then send to Websocket Server. I must be able to read data coming from Websocker Server in the same time

I managed to connect to both Servers using 1 React Connector for Socket Server, and 1 Ratchet Connector for WebSocket Server :

$loop = React\EventLoop\Factory::create();
$connector = new React\Socket\Connector($loop);

$connector->connect('192.168.0.1:9006')->then(function (React\Socket\ConnectionInterface $connection) use ($loop) {
    $connection->pipe(new React\Stream\WritableResourceStream(STDOUT, $loop));
    $connection->write("Hello World!\n");
    
    $connection->on('data', function ($chunk) {
    echo $chunk;
    // How to send $chunk to the Websocket server through second connector, see below?

});

    
});

    $reactConnector = new \React\Socket\Connector($loop, [
        'dns' => '8.8.8.8',
        'timeout' => 10
    ]);
    $connector = new \Ratchet\Client\Connector($loop, $reactConnector);

    $connector('ws://1.2.3.4:8080')
    ->then(function(Ratchet\Client\WebSocket $conn) {
        $conn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {
            echo "Received: {$msg}\n";
           // $conn->close();
        });

        $conn->on('close', function($code = null, $reason = null) {
            echo "Connection closed ({$code} - {$reason})\n";
        });

        $conn->send('Hello World!');
    }, function(\Exception $e) use ($loop) {
        echo "Could not connect: {$e->getMessage()}\n";
        $loop->stop();
    });



$loop->run();

So my question is : How can i use data received in the first connector, in the second connector?

Thank for your help!


Solution

  • I found the solution, i paste there if it can help anybody... :

    require __DIR__ . '/vendor/autoload.php';
    
    use React\Socket\Connector;
    use React\Socket\ConnectionInterface;
    
    $loop = React\EventLoop\Factory::create();
    
    
        $reactConnector = new \React\Socket\Connector($loop, [
            'dns' => '8.8.8.8',
            'timeout' => 10
        ]);
        $wsConnector = new \Ratchet\Client\Connector($loop, $reactConnector);
    
        $wsConnector('ws://1.2.3.4:8080')
        ->then(function(Ratchet\Client\WebSocket $wsConn) use ($loop) {
            
            
            $socketConnector = new React\Socket\Connector($loop);
            $socketConnector->connect('192.168.0.1:9006')->then(function (ConnectionInterface $socketConn) use ($wsConn) {
                    $socketConn->on('data', function ($msg) use ($wsConn){
                     printf("Msg received from Socket Server : %s\n", $msg);
                        // Send it to wsServer
                        $wsConn->send($msg);
                    });
                    });
            
            
            $wsConn->on('message', function(\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($wsConn) {
                     printf("Msg received from WebSocket Server : %s\n", $msg);
            });
    
            $wsConn->on('close', function($code = null, $reason = null) {
                echo "Connection closed ({$code} - {$reason})\n";
            });
    
        }, function(\Exception $e) use ($loop) {
            echo "Could not connect: {$e->getMessage()}\n";
            $loop->stop();
        });
    
    
    
    $loop->run();