PHP使用WebSocket

WebSocket编码解码与连接管理
本文探讨了WebSocket中数据的编码与解码规则,并详细解释了客户端与服务端交互过程中,如何通过特定的编码方式确保数据正确传输。此外,还分析了不同浏览器在关闭或刷新页面时对WebSocket连接的不同处理方式。
部署运行你感兴趣的模型镜像

WebSocekt的基础这里就不介绍了,网上一抓一大把,这里来和大家讨论一下一些坑

解码和编码

这个是协议规定的,从客户端发送给服务端的数据一定是经过特殊编码的,如果使用的是HTML5的websocket,在使用send函数的时候会自动进行编码,这个我们不用管,不过编码规则还是要了解一点的,毕竟服务端发数据给客户端或者解码是需要我们自己解析的,权威的文档可以看这里(所以做it英文还是要好啊。。。):
websocket_RFC
这里贴一张里面的图:

这里写图片描述

里面各个字段的意思还请自己查看文档
这里只想说一下,服务端返回的数据必须使用编码规则编码,不然客户端收不到数据,接受到的数据也需要进行解码,不然是乱码。

关闭或刷新网页

刷新网页其实执行两个步骤,先关闭连接,再重新连接,这里讨论一下关闭连接,客户端关闭连接会向服务端发送一个信息,表面自己即将断开socket连接,这个信息只有一个字节,在chrome和firefox上都是 10001000 ,这个信息的意思就要对照上面那张图来理解了,第一位表示这是最后一段信息,即后面没有信息,2-4位是留着将来用的,重要的就是5-8位,opcode,即1000,转为16进制就是ox8,这是什么意思呢:

这里写图片描述

没错,他标志这是发起一个断开连接的信息,所以当你接受到这样一条信息,你要明白客户端已经断开连接了。
然而在safari关闭浏览器时,发送过来的是 0000 0000 ,这个不清楚怎么回事。有明白的同学烦请指教。

如有不准确的地方烦请指正,共同学习共同进步

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 使用 PHPWebSocket 实现订单消息通知 为了实现实时订单消息通知,可以基于 Workerman 或者 Ratchet 这样的库来构建 WebSocket 服务器。通过这些工具,在接收到新的订单之后,能够立即向所有已连接的客户端广播更新。 #### 构建 WebSocket 服务器 首先创建一个简单的 WebSocket 服务器脚本 `server.php`: ```php <?php require_once './vendor/autoload.php'; use Workerman\Worker; use Workman\Websocket.Connection; // 创建 Websocket 服务实例并监听 2345 端口 $ws_worker = new Worker('websocket://0.0.0.0:2345'); // 设置进程数量为多核 CPU 数量 $ws_worker->count = 4; // 当有新连接建立时触发此函数 $ws_worker->onConnect = function(Connection $connection){ echo "New connection\n"; }; // 接收到来自客户端的信息时调用该方法 $ws_worker->onMessage = function(Connection $connection, $data){ // 广播给除了自己以外的所有客户 foreach($GLOBALS['connections'] as $_conn){ if($_conn !== $connection){ $_conn->send($data); } } }; // 断开连接时执行的操作 $ws_worker->onClose = function(Connection $connection){ unset($GLOBALS['connections'][$connection->id]); }; // 将当前连接保存到全局变量中以便后续操作 $ws_worker->onWorkerStart = function(){ global $connections; $connections = []; }; // 开启 worker 执行运行命令 php server.php start 来启动服务 Worker::runAll(); ``` 这段代码定义了一个基本的工作流程[^1],其中包含了当有新用户接入、发送数据以及断线后的相应处理逻辑。 #### 集成至现有应用 为了让这个 WebSocket 服务器能响应来自 Laravel 应用中的事件(比如新增加了一笔订单),可以在相应的控制器里添加如下所示的通知机制: ```php public function store(Request $request) { // 假设这里完成了订单存储过程... // 发送通知给 WebSocket Server $context = stream_context_create([ 'http' => [ 'method' => "POST", 'header'=> "Content-Type: application/json\r\n". "Connection: Close\r\n", 'content' => json_encode(['type'=>'new_order', 'message'=>"A new order has been placed."]) ] ]); file_get_contents("http://localhost:2345/", false, $context); return response()->json(['status' => 'success']); } ``` 上述片段展示了如何在成功创建一条记录后告知 WebSocket 服务器有关最新活动的情况。 #### 处理前端部分 最后一步是在用户的界面上设置好 WebSocket 的监听器,确保每当有新的信息传来都能及时显示出来。这通常涉及到 JavaScript (或 Vue.js),例如: ```javascript let socket = new WebSocket(`ws://${window.location.host}/`); socket.onopen = () => { console.log('Connected to the WebSocket'); } socket.onmessage = ({ data }) => { const parsedData = JSON.parse(data); alert(parsedData.message); // 显示弹窗提示 // 可选:刷新页面上的某些组件以反映最新的状态变化 }; ``` 以上便是整个系统的概览图景——从后端一直到最终用户体验层面的设计思路[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值