Trying to create a socket between servers with SocketIO and PHPws

833 views Asked by At

I'm having a bit of an issue with websockets. So, I have a Rpi that provides me some data through a socketIO client in a pretty simple way. The following code shows how do I get to get this data:

<!DOCTYPE html>
<html>
<header>
    <title>SocketIO test</title>
    <script src="http://192.168.5.5:8000/socket.io/socket.io.js"></script>
</header>
<body>
    <script type="text/javascript">
        var client = io.connect('http://192.168.5.5:8000');
        client.on('connect', function() {
            console.log('connected');
        });
        client.on('raw', function(data){
            console.log(data);
        });
        client.on('state', function(data){
            console.log(data);
        });
    </script>
</body>

However, what I need to implement is a little bit more complex. I need to use a Apache server to trait some of the data before it gets to the client side. The following image shows what I attempt to build:

enter image description here

To reach my goal I tried several WebSocket Servers and Client libraries for PHP until I found PHPws, which looks like the best solution for my scenario. So, I read the examples, I test them and everything went well until I tried to connect to the Rpi with the following code:

require_once("../vendor/autoload.php");
$loop = \React\EventLoop\Factory::create();
$logger = new \Zend\Log\Logger();
$writer = new Zend\Log\Writer\Stream("php://output");
$logger->addWriter($writer);

$client = new \Devristo\Phpws\Client\WebSocket("ws://192.168.5.5:8000", $loop, $logger);
$client->on("connect", function() use ($logger, $client){
    $logger->notice("Or we can use the connect event!");
    $client->send("Hello world!");
});
$client->on("raw", function($message) use ($client, $logger){
    $logger->notice("Got message: ".$message->getData());
    $client->close();
});
$client->open()->then(function() use($logger, $client){
    $logger->notice("We can use a promise to determine when the socket has been connected!");
});
$loop->run();

I've more or less taken this example from Devristo's github.

From the server side, the execution of the program is not throwing any error or message.

Is it possible to build what I want to build here with PHPws? If so, am I connecting properly to de Rpi server with PHPws sample code shown?

1

There are 1 answers

0
EMX On

It is possible :

[Node] Socket Server (This would be your RPi)

Simple socket.io server in node to check for a (success) client connection event.

var io = require('socket.io')(1337);
io.on("connection",function(socket){console.log("[+] client",socket.id);})

[PHP] Socket Client

Using Elephant.IO we setup a client (Client Example for Socket.IO v2.0)

<?php
use ElephantIO\Client;
use ElephantIO\Engine\SocketIO\Version2X;
require __DIR__ . '/vendor/autoload.php';
$client = new Client(new Version2X('http://localhost:1337', [
 'headers' => [
   'X-My-Header: websocket rocks',
   'Authorization: Bearer 12b3c4d5e6f7g8h9i'
 ]
]));
$client->initialize();
$client->emit('broadcast', ['foo' => 'bar']);
$client->close();

With this simple Client/Server example you will see the 'on connection' event in the node server when the browser opens the client.php