用PHP做后台,处理客户端的WebSocket连接,需要用 socket_* 函数族,接收消息的函数是 socket_recv ,它要求提供一个缓冲区变量,和最大字节数,但是在接收消息之前,怎么知道客户端发的消息有多大呢?是不是需要自己制定一种协议,比如,发送的数据不能超过 4294967296 (4GB),因而每条消息的前十个字符表示消息的长度。另外,就像HTTP带着Cookie,WebSocket可能也需要每条消息带着会话ID,以便区分用户……这些都是由服务端开发者来指定的吗?是的话,行业里有没有什么约定俗成的标准可以参考?还是完全自己发挥?谢谢!
2 回答
慕娘9325324
TA贡献1783条经验 获得超4个赞
你问的问题有点弄混了
底层 socket 函数,不管你是啥应用层协议,它们只管吧 字节流 收下来,应用层协议是你自己解析的,你收到字节流后,自己做应用层协议解析,
websocket 有自己的协议(协议头+payload+校验等)
一个 websocket 协议包 如果太大,你需要多次接收后拼接处理
假设你的缓冲区是 1024 字节,一个 websocket 包是 1500 个字节
那么第一次你收到 1024 发现协议包不能完全解析,就放到缓存里,再取后面的 1024 字节,凑出 1500 字节后,发现协议包解析成功了,剩下的就是下一个包的内容
万千封印
TA贡献1891条经验 获得超3个赞
swoole,workerman了解下
$data = '';while (@socket_recv($my_socket, $res, 8192, 0)) { $data .= $res; } echo $data;
- 2 回答
- 0 关注
- 421 浏览
添加回答
举报
0/150
提交
取消