如何用hyperf实现websocket服务
1创建服务器
composer require hyperf/websocket-server
2 修改 config/autoload/server.php,增加以下配置。
<?php
return [
'servers' => [
[
'name' => 'ws',
'type' => Server::SERVER_WEBSOCKET,
'host' => '0.0.0.0',
'port' => 9502,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, 'onHandShake'],
Event::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'],
Event::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'],
],
],
],
];
3 配置路由
<?php
Router::addServer('ws', function () {
Router::get('/', 'App\Controller\WebSocketController');
});
4 创建控制器
[root@iZbp13ph356ra22ldly01lZ Controller]# cat WebSocketController.php
<?php
declare(strict_types=1);
namespace App\Controller;
use Hyperf\Contract\OnCloseInterface;
use Hyperf\Contract\OnMessageInterface;
use Hyperf\Contract\OnOpenInterface;
use Swoole\Http\Request;
use Swoole\Server;
use Swoole\Websocket\Frame;
use Swoole\WebSocket\Server as WebSocketServer;
class WebSocketController implements OnMessageInterface, OnOpenInterface, OnCloseInterface
{
public function onMessage($server, Frame $frame): void
{
print_r([
'type'=>'服务端收到消息了',
'fd'=>$frame->fd,
'data'=>$frame->data
]);
$server->push($frame->fd, '收到消息了:'.$frame->data);
}
public function onClose($server, int $fd, int $reactorId): void
{
print_r([
'type'=>'服务端与客户端的连接关闭了',
'fd'=>$fd
]);
}
public function onOpen($server, Request $request): void
{
print_r([
'type'=>'服务端接入了新的连接',
'open'=>$request->fd
]);
$server->push($request->fd, '您已链接进来了'.$request->fd);
}
}
[root@iZbp13ph356ra22ldly01lZ Controller]#
5 创建客户端
composer require hyperf/websocket-client
6 创建控制器
[root@iZbp13ph356ra22ldly01lZ Controller]# cat IndexController.php
<?php
declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace App\Controller;
use Hyperf\Di\Annotation\Inject;
use Hyperf\WebSocketClient\ClientFactory;
use Hyperf\WebSocketClient\Frame;
class IndexController extends AbstractController
{
/**
* @Inject
* @var ClientFactory
*/
protected $clientFactory;
public function index()
{
print_r('######################################### start #########################################'.PHP_EOL);
// 对端服务的地址,如没有提供 ws:// 或 wss:// 前缀,则默认补充 ws://
$host = '0.0.0.0:9502/ws.io';
// 通过 ClientFactory 创建 Client 对象,创建出来的对象为短生命周期对象
$client = $this->clientFactory->create($host,false);
// 向 WebSocket 服务端发送消息
$client->push('HttpServer 中使用 WebSocket Client 发送数据。');
// 获取服务端响应的消息,服务端需要通过 push 向本客户端的 fd 投递消息,才能获取;以下设置超时时间 2s,接收到的数据类型为 Frame 对象。
/** @var Frame $msg */
$msg = $client->recv(100);
// 获取文本数据:$res_msg->data
return([
'type'=>'客户端收到返回数据',
'result'=>$msg->data
]);
}
}
7 创建web客户端
[root@iZbp13ph356ra22ldly01lZ 47.96.13.118]# cat index.html
<script>
var ws = new WebSocket("ws://47.96.13.118:9502/ws.io");
console.log('1');
ws.onopen = function(evt) {
console.log("Connection open ...");
ws.send("Hello WebSockets!");
};
ws.onmessage = function(evt) {
console.log("Received Message: " + evt.data);
ws.close();
};
ws.onclose = function(evt) {
console.log("Connection closed.");
};
</script>
8 打开防火墙开放9501和9502端口号
9 可以通过http://coolaf.com/tool/chattest
来测试websocket服务是否成功
如有问题,可以QQ搜索群1028468525加入群聊,欢迎一起研究技术
转载请注明:hyperf实现websocket 出自老鄢博客 | 欢迎分享