2017-08-29 15 views
5

Mam problem z internetowymi gniazdami. Mam więc Rpi, który dostarcza mi trochę danych za pośrednictwem klienta socketIO w całkiem prosty sposób. Poniższy kod pokazuje, w jaki sposób mogę uzyskać te dane:Próba utworzenia gniazda między serwerami za pomocą SocketIO i PHPws

<!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> 

Jednak to, co potrzebne do wdrożenia jest trochę bardziej skomplikowane. Muszę użyć serwera Apache do przekazania pewnych danych zanim dotrą one do klienta. Poniższy rysunek pokazuje, co staram się budować:

enter image description here

Aby osiągnąć mój cel Próbowałem kilku serwerów websocket i biblioteki klienta dla PHP aż znalazłem PHPws, który wygląda jak najlepszego rozwiązania dla mojego scenariusza. Więc czytam przykłady, przetestować je i wszystko szło dobrze dopóki nie próbowałem połączyć się z Rpi z następującego kodu:

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(); 

mam mniej lub bardziej brane this example z github Devristo użytkownika.

Po stronie serwera wykonanie programu nie powoduje żadnego błędu ani komunikatu.

Czy jest możliwe zbudowanie tego, co chcę tutaj zbudować za pomocą PHPws? Jeśli tak, czy prawidłowo łączę się z serwerem de Rpi z pokazanym kodem przykładowym PHPws?

Odpowiedz

0

Jest to możliwe:

[Node] Socket Server (to byłby to RPi)

Prosty serwer socket.io w węźle w celu sprawdzenia zdarzenia (sukces) połączenie klienta.

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

[PHP] Gniazdo Client

Korzystanie Elephant.IO mamy konfigurację klienta (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(); 

Dzięki tym prostym przykładzie Client/Server można zobaczyć „na połączenie 'zdarzenie w serwerze węzła, gdy przeglądarka otwiera client.php

Powiązane problemy