Think-Swoole之WebSocket客户端消息解析与使用SocketIO处理用户UID与fd关联
发布时间 - 2020-10-20 00:00:00 点击率:次WebSocket 客户端消息的解析
前面我们演示了当客户端连接服务端,会触发连接事件,事件中我们要求返回当前客户端的 fd。当客户端发送消息给服务端,服务端会根据我们的规则将消息发送给指定 fd 的客户端:
app/listener/WsConnect.php
emit('sendfd',$ws -> getSender());
}
}app/listener/WsTest.php
to(intval($event['to'])) -> emit('testcallback',$event['message']);
}
}客户端执行上述两个事件后,控制台打印出以下信息:
返回信息前面有一些数字,40、42都代表什么意义呢?
因为我们使用的扩展是基于 SocketIO 协议的,这些数字可以理解为协议的代号。
打开 /vendor/topthink/think-swoole/src/websocket/socketio/Packet.php ,有以下内容:
上面是 Socket 类型,下面是引擎,前后两个代号上下拼凑得到:
40:”MESSAGE CONNECT” 42:”MESSAGE EVENT”
结合这些代码,能知道 SocketIO 中消息的大体运作情况。
通过控制台打印出的消息,我们发现这些消息不能直接拿到使用,需要进行截取处理:
test.html
Document
消息:
接收者:
解析后的数据:
使用 SocketIO 处理消息业务
SocketIO 的相关知识可以查看文档,重点看客户端方面知识:
https://www.w3cschool.cn/socket/socket-k49j2eia.html
iotest.html
Document
消息:
接收者:
var socket = io("http://127.0.0.1:9501", {transports: ['websocket']}); 中第二个参数指明要升级的协议。
app/listener/WsConnect.php
emit('sendfd',$ws -> getSender());
}
}app/listener/WsTest.php
to(intval($event['to'])) -> emit('testcallback',$event['message']);
$ws -> to(intval($event['to'])) -> emit('testcallback',[
'form' => [
'id' => 10,
'fd' => $ws -> getSender(),
'nickname' => '张三'
],
'to' => [
'id' => 11,
'fd' => intval($event['to']),
'nickname' => '李四'
],
'massage' => [
'id' => 888,
'create_time' => '2025-03-13',
'content' => $event['message']
]
]);
}
}开启两个客户端,fd 分别是5、6:
WsConnect.php 中,有 $ws -> emit('sendfd',$ws -> getSender()); 发送 fd 消息对应的场景值是 “sendfd” ,在 iotest.html 中,有socket.on("sendfd", function (data) {console.log(data)}); 这段代码,其中也有场景值 “sendfd”,这行代码可以直接获取对应场景值的信息,所以控制台上会打印出 fd 值。
用 fd 5 向 fd 6 发送信息:
两个客户端均会受到信息:
可见消息已经经过解析,因为 WsTest.php 中 发送消息指定场景值 testcallback,iotest.html 中通过 socket.on("testcallback", function (data){console.log(data)}); 可直接获取解析过的结果。
这就看出了 SocketIO 在客户端消息接收方面的便捷之处了。
用户 UID 和客户端 fd 的绑定
前面的例子中,都是通过指定 fd 来向客户端发送消息,实际场景中,我们不可能通过 fd 确定发送对象,因为 fd 不是固定不变的,因此需要将用户的 UID 与客户端的 fd 进行绑定,进而可以通过选择用户,来确定 fd 完成消息的发送。
只需要将前端页面的 HTTP 连接中增加 UID 参数即可:
test.html
var ws = new WebSocket("ws://127.0.0.1:9501/?uid=1");iotest.html
var socket = io("http://127.0.0.1:9501?uid=1", {transports: ['websocket']});后端可以在连接事件中进行绑定:
app/listener/WsConnect.php
get('uid');
//获取 fd
$fd = $ws -> getSender();
//获取到 uid 和 fd 后,可以存数据库,内存或者 redis
$ws -> emit('sendfd',[
'uid' => $uid,
'fd' => $fd
]);
}
}有了 UID 与 fd ,可以在每次连接成功后,更新数据库,连接断开后再清空用户对因的 fd。假如服务器重启,那么二者的对应关系也就没用了,所以不必存入数据库,存入 Redis 最好,通过 Redis 的 Hash 来映射二者关系也是不错的选择。
# websocket
# php
# swoole
# html
# console
# function
# 对象
# 事件
# redis
# 数据库
# http
# https
# 客户端
# 绑定
# 服务端
# 后端
# 发送消息
# 自定义
# 都是
# 也有
# 不可能
# 之处
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Bootstrap整体框架之JavaScript插件架构
EditPlus中的正则表达式实战(5)
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
JS中对数组元素进行增删改移的方法总结
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Laravel安装步骤详细教程_Laravel环境搭建指南
jQuery中的100个技巧汇总
Laravel如何优化应用性能?(缓存和优化命令)
如何确保西部建站助手FTP传输的安全性?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
网站建设保证美观性,需要考虑的几点问题!
使用spring连接及操作mongodb3.0实例
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
java获取注册ip实例
用yum安装MySQLdb模块的步骤方法
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
佛山企业网站制作公司有哪些,沟通100网上服务官网?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
jQuery 常见小例汇总
bing浏览器学术搜索入口_bing学术文献检索地址
进行网站优化必须要坚持的四大原则
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
如何用PHP快速搭建CMS系统?
如何做网站制作流程,*游戏网站怎么搭建?
简单实现jsp分页
javascript日期怎么处理_如何格式化输出
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
IOS倒计时设置UIButton标题title的抖动问题
如何在局域网内绑定自建网站域名?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
javascript读取文本节点方法小结
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
如何在建站之星网店版论坛获取技术支持?
如何在云服务器上快速搭建个人网站?
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
详解Android中Activity的四大启动模式实验简述
常州企业网站制作公司,全国继续教育网怎么登录?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】


'nickname' => '李四'
],
'massage' => [
'id' => 888,
'create_time' => '2025-03-13',
'content' => $event['message']
]
]);
}
}