project-mirai / mirai-api-http

Mirai HTTP API (console) plugin
GNU Affero General Public License v3.0
1.64k stars 346 forks source link

[建议] 添加心跳数据包(Ping) #730

Closed bunnyi116 closed 1 year ago

bunnyi116 commented 1 year ago

客户端主动发送一个PING数据包(内容可自定义),然后服务端接收到后将内容原封不动的发送到客户端,用来客户端检查连接状况,类似于PING。

这样客户端可以主动检查连接状态,避免MiraiApiHttp意外断开连接后,客户端可以通过一个周期发PING包主动感知连接的状态。

ryoii commented 1 year ago

HTTP的话没必要,WebSocket 的话可以发 Ping 帧

bunnyi116 commented 1 year ago

搜到的资料

  WebSocket为了保持客户端、服务端的实时双向通信,需要确保客户端、服务端之间的TCP通道保持连接没有断开。然而,对于长时间没有数据往来的连接,如果依旧长时间保持着,可能会浪费包括的连接资源。但不排除有些场景,客户端、服务端虽然长时间没有数据往来,但仍需要保持连接。这个时候,可以采用心跳来实现。
  发送方->接收方:ping;
  接收方->发送方:pong;
  ping、pong的操作,对应的是WebSocket的两个控制帧,opcode分别是0x9、0xA。

  websocket ping pong:目前的话,浏览器中没有相关api发送ping给服务器,只能由服务器发ping给浏览器,浏览器返回pong消息;

  WebSocket控制帧有3种:Close(关闭帧)、Ping以及Pong。
  控制帧的操作码定义了0x08(关闭帧)、0x09(Ping帧)、0x0A(Pong帧)。Close关闭帧很容易理解,客户端如果接受到了就关闭连接,客户端也可以发送关闭帧给服务端。Ping和Pong是websocket里的心跳,用来保证客户端是在线的,一般来说只有服务端给客户端发送Ping,然后客户端发送Pong来回应,表明自己仍然在线。

WebSocket 没有API可以发送PING控制帧,只有主动Close的方法,然后如果服务端意外断开,服务端则不会通知之前已连接的客户端,而客户端没有感知到已经断开,导致资源浪费。