尝试使用SocketIO和PHPws在服务器之间创建套接字

时间:2017-08-29 10:46:22

标签: node.js apache socket.io phpwebsocket phpws

我对websockets有点问题。所以,我有一个Rpi,它以一种非常简单的方式通过socketIO客户端为我提供了一些数据。以下代码显示了如何获取此数据:

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

然而,我需要实现的是更复杂一点。我需要使用Apache服务器来传输一些数据,然后才能到达客户端。下图显示了我尝试构建的内容:

enter image description here

为了实现我的目标,我尝试了几个用于PHP的WebSocket服务器和客户端库,直到找到PHPws,这看起来是我的方案的最佳解决方案。 所以,我阅读了这些示例,我测试了它们,一切顺利,直到我尝试使用以下代码连接到Rpi:

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

我或多或少地从Devristo的github中获取this example

从服务器端,程序的执行不会引发任何错误或消息。

是否可以使用PHPws构建我想要构建的内容? 如果是这样,我是否正确连接到de Rpi服务器并显示PHPws示例代码?

1 个答案:

答案 0 :(得分:0)

有可能:

[Node]套接字服务器(这将是您的RPi

节点中的简单socket.io服务器检查a     (成功)客户连接事件。

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

[PHP]套接字客户端

使用https://doc.scrapy.org/en/latest/topics/request-response.html#topics-request-response-ref-errbacks我们设置了一个客户端(Elephant.IO

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

使用这个简单的客户端/服务器示例,当浏览器打开client.php

时,您将在节点服务器中看到“on connection”事件