如何将带有状态码的 WebSocket 关闭帧发送到浏览器?
Posted
技术标签:
【中文标题】如何将带有状态码的 WebSocket 关闭帧发送到浏览器?【英文标题】:How to send WebSocket close frame with status code to a browser? 【发布时间】:2021-08-06 11:19:08 【问题描述】:我的目标是使用/code/
和/reason/
发送WebSocket 关闭帧。
我从 RFC6455 中引用它说
If there is a body, the first two bytes of
the body MUST be a 2-byte unsigned integer (in network byte order)
representing a status code with value /code/ defined in Section 7.4.
Following the 2-byte integer, the body MAY contain UTF-8-encoded data
with value /reason/, the interpretation of which is not defined by
this specification.
我的期望是基础框架协议
first byte = FIN, RSV1, RSV2, RSV3, opcode
second byte = Mask, Payload len
third byte = /code/
fourth byte = /code/
fifth byte and so on = /reason/
for example code 1000 would be 1111101000.
third byte = 11111010
fourth byte = 0x00
我做了什么:
-
发送
unmasked close frame
不带/code/
或/reason/
。
public static final byte[] Unmasked_Close_Frame = new byte[](byte) 0x88, 0;
我想做什么:
-
发送带有
/code/
1000 和不带/reason/
的WebSocket 关闭帧
public static final byte[] Unmasked_Close_Frame = new byte[](byte) 0x88, 0, (byte) 0xFA, 0;
-
发送带有
/code/
1000 和/reason/
的WebSocket 关闭帧,没有理由哈哈
public static final byte[] Unmasked_Close_Frame = new byte[](byte) 0x88, 13, (byte) 0xFA, 0, (byte) 110, (byte) 111, (byte) 32, (byte) 114, (byte) 101, (byte) 97, (byte) 115, (byte) 111, (byte) 110, (byte) 32, (byte) 108, (byte) 111, (byte) 108;
我的预期结果:浏览器应该干净地关闭 websocket 连接。
我的实际结果:服务器发送的关闭帧引发error
事件。
let socket = new WebSocket("ws://localhost:80");
socket.onerror = function(error)
alert(`[error] $error.message`);
;
【问题讨论】:
【参考方案1】:我的错。
这部分我错了
for example code 1000 would be 1111101000.
third byte = 11111010
fourth byte = 0x00
这应该是
for example code 1000 would be 1111101000.
third byte = 0x03
fourth byte = 11101000
而且,近框内的Payload len
包括/code/
和/reason/
。
所以,Payload len
只能是 0
或 2
如果你添加了 /code/
和 2 + reason length
如果你有 /code/
和 /reason/
例如,
有效载荷 len = 2 + 13 = /code/
+ /reason/
代码 = 1000
原因=没有理由哈哈
public static final byte[] Unmasked_Close_Frame = new byte[](byte) 0x88, 15, 3, (byte) 0xE8, (byte) 110, (byte) 111, (byte) 32, (byte) 114, (byte) 101, (byte) 97, (byte) 115, (byte) 111, (byte) 110, (byte) 32, (byte) 108, (byte) 111, (byte) 108;
【讨论】:
以上是关于如何将带有状态码的 WebSocket 关闭帧发送到浏览器?的主要内容,如果未能解决你的问题,请参考以下文章