java socket writeUTF()和readUTF()

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

writer.java writeUTF("Hello"); writeUTF("World"); reader.java String a=readUTF(); // a=Hello String a=readUTF(); // b=World 

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

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

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

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

这应该意味着读取操作将一直等到在返回字符串之前已经提取了足够的字符。这意味着如果你没有看到它们它们实际上是分段的,因为你只是用DataInputStreamDataOutputStream来装饰套接字的流。

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

java.net.Socket工作正常,流等待readUTF();

但是当使用mina的CumulativeProtocolDecoder ,它不会抛出java.io.EOFException