使用PHP连接到Ratchet Websocket服务器

3

我在后端运行一个Ratchet WebSocketServer,一切都正常工作。

<?php

require '../vendor/autoload.php';

use Ratchet\WebSocket\WsServer;
use Ratchet\Http\HttpServer;

$wsServer = new WsServer(new Chat());
$wsServer->disableVersion(0);

$server = \Ratchet\Server\IoServer::factory(
    new HttpServer(
        $wsServer
    ),
    8080
);

$server->run();

但是我希望使用一个普通的php脚本连接到websocket,并向服务器发送消息。

$host = 'ws://localhost';  //where is the websocket server
$port = 8080;
$local = "http://example.com";  //url where this script run 
$data = "first message";  //data to be send

$head = "GET / HTTP/1.1"."\r\n".
    "Upgrade: WebSocket"."\r\n".
    "Connection: Upgrade"."\r\n".
    "Origin: $local"."\r\n".
    "Host: $host:$port"."\r\n".
    "Sec-WebSocket-Key: asdasdaas76da7sd6asd6as7d"."\r\n".
    "Content-Length: ".strlen($data)."\r\n"."\r\n";

//WebSocket handshake
$sock = fsockopen($host, $port);
fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr);
$headers = fread($sock, 2000);

echo $headers;

fwrite($sock, $data) or die('error:'.$errno.':'.$errstr);
$wsdata = fread($sock, 2000);
fclose($sock);

但是我收到的错误信息是什么。
error:32744:Unable to find the socket transport "ws" - did you forget   to enable it when you configured PHP?

当我更改主机并且不使用ws://时,它会报错。
error:111:Connection refused

有人知道如何从普通php文件向运行中的Ratchet WebSocket服务器发送数据吗?

1个回答

9

我尝试了使用Ratchet与该项目一起运行,作为PHP客户端,效果完美:

https://github.com/Textalk/websocket-php

安装方法如下: composer require textalk/websocket 1.0.*

以下是一个使用示例:

<?php

require('vendor/autoload.php');

use WebSocket\Client;

$client = new Client("ws://127.0.0.1:1234");
$client->send("Hello from PHP");

echo $client->receive() . "\n"; // Should output 'Hello from PHP'

我已经测试过,如果你使用wss://(远程websocket)协议,那么这也适用于SSL。


@Raisin. 我们能否在PHP中使用这个库通过WebSocket发送字节数组? - Vision Coderz
该库期望send()函数传递一个字符串。如果您的服务器使用PHP(例如Ratchet),您可以在客户端对字节数组进行序列化,然后让服务器进行反序列化。如果不是所有在Ratchet上接收到的消息都是字节数组,您可能希望像byte_array:a:44:{i:1;i:84; ...等那样给这些消息添加前缀。 - RaisinBranCrunch
如果我进行序列化,它会被发送为字符串,但接收端只能接收字节数组,所以无法进行序列化。 - Vision Coderz
在我的情况下,我使用非root用户运行php composer require textalk/websocket来安装库。此外,我删除了echo $client->receive()并改用$client->close() - s.abbaasi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接