二进制与字符串在流传输中的区别

13

我正在进行一个有关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编码/解码。这是唯一的区别吗?如果我只读取每个字节,将它们组合成一个字符串并发送它们会怎样呢?我认为,唯一的区别就是不是所有的字节都是字符串字符,所以当转换为字符串时会增加开销。

简而言之-> 二进制传输和字符串传输有什么区别?


3
你在问几个问题?! - Mob
@Mob,我有点困惑,实际上这只是一个问题,它们有什么区别?我只是为了更清楚地表达而将问题拆分了。如果您愿意,我可以进行改述。 - Mustafa
2个回答

13

WebSocket协议(HyBi)支持两种不同的负载类型: 文本、二进制。文本负载是UTF-8编码的字符串数据。在发送的字符串中,任何ASCII码大于127的字符将被转换为两个字节的UTF-8编码。为了成功地发送/接收原始二进制数据,您可能需要将数据编码为类似base64的内容(这是UTF-8兼容的)。

二进制负载直接发送,字节作为有效载荷原样发送。这更高效地利用了带宽。这意味着您不必进行编码/解码步骤。您发送的字节会直接发送,您接收到的字节可以直接访问而无需解码。


接收到的字节可以直接访问:这对所有客户端都适用,例如Android(okhttp3)和iOS(starscream)吗? - DragonFire

1

当您使用二进制模式时,在发送数据之前不会进行UTF-8转换。就速度而言,由于文本的UTF-8编码非常快且可以忽略不计,因此几乎没有什么区别。看起来他们给了您两个选项,这样您就可以根据要发送的数据类型选择发送数据的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接