swoole基础-WebSocket服务

2022-04-29 15:26:10 浏览数 (1)

一,WebSocket服务器创建

代码语言:javascript复制
<?php
//  ----------------------------------------------------------------------
// | Author: 公众号搜索;程序猿的栖息地
//  ----------------------------------------------------------------------
namespace server;
/**
 * 概要描述:WebSocket服务器
 * @author: 公众号搜索;程序猿的栖息地
 * @since: 2020-05-23 22:45
 */
class WebSocketServer
{
    protected $serv = null;       //SwooleServer对象
    protected $host = '0.0.0.0'; //监听对应外网的IP 0.0.0.0监听所有ip
    protected $port = 9604;      //监听端口号

    public function __construct()
{
        //创建websocket服务器对象,监听0.0.0.0:9604端口
        $this->serv = new SwooleWebsocketServer($this->host, $this->port);

        //设置参数
        //如果业务代码是全异步 IO 的,worker_num设置为 CPU 核数的 1-4 倍最合理
        //如果业务代码为同步 IO,worker_num需要根据请求响应时间和系统负载来调整,例如:100-500
        //假设每个进程占用 40M 内存,100 个进程就需要占用 4G 内存
        $this->serv->set(array(
            'worker_num' => 4,         //设置启动的worker进程数。【默认值:CPU 核数】
            'max_request' => 10000,    //设置每个worker进程的最大任务数。【默认值:0 即不会退出进程】
            'daemonize' => 0,          //开启守护进程化【默认值:0】
        ));
        //监听WebSocket连接打开事件
        $this->serv->on('open', function ($serv, $req) {
            echo "connection open: {$req->fd}" . PHP_EOL;
        });

        //监听WebSocket消息事件
        //客户端向服务器端发送信息时,服务器端触发 onMessage 事件回调
        //服务器端可以调用 $server->push() 向某个客户端(使用 $fd 标识符)发送消息,长度最大不得超过 2M
        $this->serv->on('message', function ($serv, $frame) {
            echo "Message: {$frame->data}". PHP_EOL;
            $this->serv->push($frame->fd, "server: {$frame->data}");
        });

        //监听WebSocket连接关闭事件
        $this->serv->on('close', function ($serv, $fd) {
            echo "connection close: {$fd}". PHP_EOL;
        });

        //启动服务
        $this->serv->start();
    }
}
$webSocketServer = new WebSocketServer();

二,运行WebSocket服务

需要用php CLI模式运行

三,测试

可以使用 Chrome 浏览器进行测试,JS 代码为:

代码语言:javascript复制
<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
</head>

<body>
  <script>
    var wsServer = 'ws://212.64.29.192:9604';
    var websocket = new WebSocket(wsServer);
    
    websocket.onopen = function (evt) {
      console.log("Connected to WebSocket server.");
      //发送消息
      websocket.send("我发送的消息");
    };

    websocket.onclose = function (evt) {
      console.log("Disconnected");
    };

    websocket.onmessage = function (evt) {
      console.log('Retrieved data from server: '   evt.data);
    };

    websocket.onerror = function (evt, e) {
      console.log('Error occured: '   evt.data);
    };
</script>
</body>
<html>

打开浏览器的控制台,可以看到客户端已经正常收发消息

0 人点赞