作者:宇智臣风 | 来源:互联网 | 2023-08-11 14:23
问题描述
背景 :创建了websocket服务器对象,并且浏览器端可以与这个websocket服务器正常通信,正常监听到各种事件。
业务需要:要实现服务器端主动给目标客户端发送消息。
解决方案:打算把php作为客户端,给服务端发送特定消息,服务端监听到后,推送给相应客户端。
在尝试的过程中,遇到了各种问题,详见如下代码及报错⬇️
//首先创建了websocket服务器对象,监听0.0.0.0:9502端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| $ws = new \swoole_websocket_server("0.0.0.0", 9502);
$this->sw = $ws;
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
$ws->push($request->fd, "hello, welcome\n");
});
$ws->on('connect', function ($ws, $fd){
echo "Client:Connect. fd {$fd}\n";
});
$ws->on('receive', function ($serv, $fd, $reactor_id, $data) {
echo "Client:Connect. fd : {$fd}\n";
echo "Client:Connect. data: {$data}\n";
});
//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
echo "Message: {$frame->data}\n";
echo "fd: {$frame->fd}\n";
});
//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
});
$ws->start(); |
之后开始尝试php作为客户端,连接websocket服务,并且发送消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| //php客户端尝试 1
$host = "127.0.0.1";
$port = 9502;
$client = new \swoole_websocket_server(SWOOLE_SOCK_TCP | SWOOLE_KEEP,SWOOLE_SOCK_SYNC);
$timeout = 0.5;//超过与服务器交互的超时秒数会自动断开
$client->connect($host, $port, $timeout);
$client->send('XXXXXX');
报错:Swoole\Server::__construct(): swoole_server only can be used in PHP CLI mode.
//php客户端尝试 2
$client = new Swoole\Client(SWOOLE_SOCK_TCP | SWOOLE_SYNC);
if (!$client->connect('127.0.0.1', 9502, 0.5))
{
exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");
$client->close();
报错 : 服务端可以监听到 connect事件和close事件,无法监听到send 发送的内容
//php客户端尝试 3
尝试安装官方文档给出的方法:
apache/php-fpm或其他同步阻塞的PHP程序中可以使用swoole/framework提供的同步WebSocket客户端
同步WebSocket客户端连接:https://github.com/matyhtf/framework/blob/master/libs/Swoole/Client/WebSocket.php
代码:
$service = new WebSocket($host,$port);//service 即为同步WebSocket客户端中的代码
$send = $service->send('XXXXXX');//调用服务中的send方法
报错:Class 'Swoole\Http\WebSocketParser' not found |
期待
1 2 3 4 5
| 有方法可以实现,php作为客户端,连接已经创建的webscoket服务,并且发送的消息在服务端可以监听到 。
看到网上看到许多类似的问题,但是都没有很有效的答案。
请问这个问题该如何解决呢 ? |