java socket writeUTF()和readUTF()

Fel*_*han 11 java sockets

我一直在阅读一些Java套接字代码片段,并且说明了在套接字通信中,为了按顺序发送消息,您不必手动分离它们,编写器/阅读器流会自动为您做事.这是一个例子:

writer.java
writeUTF("Hello");
writeUTF("World");


reader.java
String a=readUTF(); // a=Hello
String a=readUTF(); // b=World
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这段代码片段并且工作正常.但是,我想知道这种编码风格是否应该正常工作.是否存在按顺序使用套接字流而不明确分隔每个分段的潜在风险?

Mic*_*rdt 27

writeUTF()readUTF()写入字符串的长度(以字节为单位,当为UTF-8编码),然后由数据,并使用UTF-8修改编码.所以有一些潜在的问题:

  • 可以这种方式进行处理的字符串的最大长度为65535纯ASCII,少如果使用非ASCII字符 - 并且无法容易地预测在这种情况下,限制,比保守假设每字符3个字节等.因此,如果你确定你永远不会发送超过20k的字符串,你会没事的.
  • 如果应用日益需要与其他的东西(这不是用Java编写的)沟通,对方可能也很难处理UTF-8修改.对于应用程序内部通信,您不必担心.


Jac*_*ack 2

根据文档,readUTFwriteUTF方法适用于 UTF8 的修改版本,该版本还添加了要在开头读取的字符的长度。

这应该意味着读取操作将等到获取足够的字符后才返回字符串。这意味着如果您没有看到它,它们实际上也是分段的,因为您只是用 和 装饰套接字的DataInputStreamDataOutputStream

总之,是的,它应该非常安全,因为 API 本身会负责分离单个消息。