前言:了解了概念之后就应该练练手啦,不然就是语言的巨人,行动的矮子啦
实战 swoole【聊天室】
在线体验
准备工作
需要先看初识 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

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

被折叠的 条评论
为什么被折叠?



