swoole / swoole-src

🚀 Coroutine-based concurrency library for PHP
https://www.swoole.com
Apache License 2.0
18.47k stars 3.16k forks source link

websocket服务器为什么在onclose事件中不提供closeCode #5412

Closed caijwei closed 4 months ago

caijwei commented 4 months ago

Please answer these questions before submitting your issue.

  1. What did you do? If possible, provide a simple script for reproducing the error.

代码中需要用到closeCode来确定断开连接后,应该针对性的执行怎样的逻辑,但是onClose并没有这个值

文档中提到可以通过设置open_websocket_close_frame为true,将关闭帧挪到onMessage中执行,但是实际测试发现,并非所有的关闭连接场景都会发送关闭帧

比如WebSocket\Frame bug提到的非正常关闭,比如服务器通过disconnect断开连接,都不会触发onMessage

  1. What did you expect to see?

可否在onClose传递或通过某些方式可以获取到closeCode,毕竟closeCode是webSocket协议的标准,没理由没有啊

  1. What did you see instead?

  2. What version of Swoole are you using (show your php --ri swoole)?

  3. What is your machine environment used (show your uname -a & php -v & gcc -v) ?

NathanFreeman commented 4 months ago

close_frame只有正常关闭或者主动发送服务端才能收到,如果是客户端非正常关闭,close_frame没法由客户端发出,服务端此时会知道客户端关闭了,从而执行ocClose事件,可以说close事件只针对tcp连接的关闭。

matyhtf commented 4 months ago

比如https://github.com/swoole/swoole-src/issues/2121提到的非正常关闭,比如服务器通过disconnect断开连接,都不会触发onMessage

onMessage 是指接收到来自客户端的消息,close frame 本质上也是一种应用层面的消息。服务端 disconnect 的过程中,并不会有客户端向服务器发送消息,因此不会有 onMessage,对应的是底层 TCP 连接的 onReceive 事件。

onConnect/onClose/onDisconncect 的语意是 TCP 连接的建立和断开,并非数据传输事件。