swoole 项目实战——实现简单聊天室

本文介绍了如何使用Swoole实现一个简单的聊天室。首先,文章建议读者了解Swoole的基础知识,特别是WebSocket服务。接着,通过官方示例讲解了Swoole_websocket_server的工作原理,包括onOpen和onMessage事件。然后,提供了聊天室服务端的目录结构和代码示例,分别基于内存表和Redis实现。最后,作者总结了这个简单聊天室的实现,并推荐了进一步学习的资源。
摘要由CSDN通过智能技术生成

前言:了解了概念之后就应该练练手啦,不然就是语言的巨人,行动的矮子啦

准备工作

  • 需要先看初识 swoole【上】,了解基本的服务端 WebSocket 使用

  • js WebSocket 客户端简单使用

使用

# 命令行1
php src/websocket/run.php
# 命令行2
cd public && php -S localhost:8000
# 客户端,多开几个查看效果
访问http://localhost:8000/

WebSocket

官方示例

$server = new swoole_websocket_server("0.0.0.0", 9501);
$server->on('open', function (swoole_websocket_server $server, $request) {
        echo "server: handshake success with fd{$request->fd}\n";
    });
$server->on('message', function (swoole_websocket_server $server, $frame) {
        echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
        $server->push($frame->fd, "this is server");
    });
$server->on('close', function ($ser, $fd) {
        echo "client {$fd} closed\n";
    });
$server->on('request', function (swoole_http_request $request, swoole_http_response $response) {
        global $server;//调用外部的server
        // $server->connections 遍历所有websocket连接用户的fd,给所有用户推送
        foreach ($server->connections as $fd) {
            $server->push($fd, $request->get['message']);
        }
    });
$server->start();

详解:

  • swoole_websocket_server 继承自 swoole_http_server

    • 设置了 onRequest 回调,websocket 服务器也可以同时作为 http 服务器

    • 未设置 onRequest 回调,websocket 服务器收到 http 请求后会返回 http 400 错误页面

    • 如果想通过接收 http 触发所有 websocket 的推送,需要注意作用域的问题,面向过程请使用 global 对 swoole_websocket_server 进行引用,面向对象可以把 swoole_websocket_server 设置成一个成员属性

  • function onOpen(swoole_websocket_server $svr, swoole_http_request $req);

    • 当 WebSocket 客户端与服务器建立连接并完成握手后会回调此函数。

    • $req 是一个 Http 请求对象,包含了客户端发来的握手请求信息

    • onOpen 事件函数中可以调用 push 向客户端发送数据或者调用 close 关闭连接

    • onOpen 事件回调是可选的

  • function onMessage(swoole_websocket_server $server, swoole_websocket_frame $frame)

    • 当服务器收到来自客户端的数据帧时会回调此函数。

    • $frame 是 swoole_websocket_frame 对象,包含了客户端发来的数据帧信息

    • onMessage 回调必须被设置,未设置服务器将无法启动

    • 客户端发送的 ping 帧不会触发 onMessage,底层会自动回复 pong 包

  • swoole_websocket_frame 属性

    • $frame->fd,客户端的 socket id,使用 $server->push 推送数据时需要用到

    • $frame->data,数据内容,可以是文本内容也可以是二进制数据,可以通过 opcode 的值来判断

    • $frame->opcode,WebSocket 的 OpCode 类型,可以参考 WebSocket 协议标准文档

    • $frame->finish, 表示数据帧是否完整,一个 WebSocket 请求可能会分成多个数据帧进行发送(底层已经实现了自动合并数据帧,现在不用担心接收到的数据帧不完整&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值