通过流进行二进制与字符串传输

2022-09-04 21:12:43

我正在用WebSockets和Java做一个小实验。显然,根据WebSocket的最后一稿,消息可以是二进制的,也可以是纯字符串。我使用Webbit服务器,它有两个功能:

public void onMessage(WebSocketConnection connection, String message) 

public void onMessage(WebSocketConnection connection, byte[] message)

我想知道有什么区别。byte[] 更快吗?或者为什么这很重要?我可以用字节写入我写的所有内容,因为即使是字符串在传输时也会组合成字节,那么为什么我们有两个多种方法呢?只有Google Chrome 15 Beta和16 Dev支持二进制传输,所以我正在考虑在客户端和服务器上使用Base64编码/解码。这是唯一的区别吗?如果我只是读取每个字节,将它们组合成一个字符串并发送它们,该怎么办?我认为,唯一的区别是并非所有字节都是字符串字符,所以我在转换为字符串时只需添加开销即可?

tl;dr -> 二进制传输和字符串传输有什么区别?


答案 1

WebSocket 协议 (HyBi) 支持两种不同的有效负载类型:文本、二进制。文本负载是 UTF-8 编码的字符串数据。您发送的字符串中任何大于 127 的 ASCII 代码都将转换为双字节 UTF-8 编码。要成功发送/接收原始二进制数据,您可能需要将数据编码为base64(与UTF-8兼容)之类的东西。

直接发送二进制负载类型。字节在有效负载中按原样发送。这提高了带宽效率。这意味着您不必执行编码/解码步骤。您发送的字节直接发送,您收到的字节可以直接访问,无需解码。


答案 2

使用二进制模式时,在发送数据之前不会对数据进行 UTF-8 转换。就速度而言,差异很小,因为文本的UTF-8编码非常快且可以忽略不计。看起来它们为您提供了两个选项,因此您可以根据要发送的数据类型以任何一种方式发送该数据。