Java 怎么维持 WebSocket 的全双工连接?握手、帧、关闭和 JDK 客户端特有的 request(n) 背压是什么样子?这篇用 Netty 4.1 做服务端、JDK 21 做客户端,逐项验证(HTTP/2 在后面的篇目,HttpClient 见前面一篇)。
客户端发出的升级请求关键头:Upgrade: websocket、Connection: Upgrade、Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==、Sec-WebSocket-Version: 13
服务端响应:
HTTP/1.1 101 Switching Protocols
upgrade: websocket
connection: upgrade
sec-websocket-accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 事件顺序:
onOpen
onText echo:hello
onBinary [1, 2, 3] last=true
onText echo:par
onPing 3 字节
onText m1
onText m2
onText m3
onText m4
onText m5
onClose 1000 "client done"
ws.isInputClosed() = true,ws.isOutputClosed() = true
关闭之后再 sendText:IOException 从来没有调用 request(n):服务端连发 5 条消息,客户端的 onText 被调用了 0 次
之后调用 ws.request(2):onText 累计 2 次
再调用 ws.request(10):累计 5 次
onOpen 里 request(1),每次 onText 后再 request(1):服务端连发 5 条消息,客户端的 onText 被调用了 5 次服务端主动发 Close(4000, "server says bye"):客户端 [onClose 4000 "server says bye"];ws.isInputClosed() = true,ws.isOutputClosed() = true