87,838
社区成员




如果是十六进制的数据片段,比如0x09 00 00 00 05 02 01 00类似的,我在传输时为了确保客户端websocket可以解析,就必须转化成ASCII码字符串吗?
请问可以直接传输吗?
我在客户端js里面写了:
ws = new WebSocket('ws://127.0.0.1:20000');
ws.binaryType = 'arraybuffer';
...
但这样还是不行,会客户端提示错误:websocket connection to xxx failed: could not decode a text frame as utf-8
WebSocket协议支持传输二进制数据,你不需要将二进制数据转化成ASCII码字符串。在你的客户端JavaScript中,你已经设置了ws.binaryType = 'arraybuffer',这表明你希望WebSocket接收和处理二进制数据。
然而,你遇到的错误消息"could not decode a text frame as utf-8"表明WebSocket服务器可能在发送数据时使用了文本帧(text frame),而不是二进制帧(binary frame)。WebSocket有两种数据帧类型,分别是文本帧和二进制帧。你需要确保服务器在发送数据时使用二进制帧,以使客户端可以正确解析二进制数据。
在服务器端,确保你发送的数据以二进制帧的形式进行发送,具体如何实现取决于你使用的编程语言和WebSocket库。通常,在服务器端设置消息类型为二进制,然后发送二进制数据即可。
如果你无法修改服务器端的实现,但需要接收二进制数据,那么你可以尝试接收文本数据,然后在客户端将其转化为二进制数据。这个过程称为数据解析,需要根据数据格式和协议进行相应的解析。在JavaScript中,你可以使用TextDecoder来将文本数据解码为二进制数据。
如果你控制服务器端,最好的方法是确保服务器以二进制帧的形式发送二进制数据,这样客户端不需要进行额外的解析。