如何将带有状态码的 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 只能是 02 如果你添加了 /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 关闭帧发送到浏览器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 服务器上向客户端发送 WebSocket 关闭帧?

c++ websocket帧发送导致服务器关闭连接

WebSocket - 关闭框架

Websocket协议数据帧传输和关闭连接

Websockets 不能发送大数据

[WebSocket] 开发在线客服系统知识点-websocket返回状态码的含义