hyperf实现websocket

发布时间:2021-12-30 09:45:09 阅读:1622次

如何用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加入群聊,欢迎一起研究技术

支付宝 微信

有疑问联系站长,请联系QQ:QQ咨询

转载请注明:hyperf实现websocket 出自老鄢博客 | 欢迎分享