繁体   English   中英

java socket writeUTF()和readUTF()

[英]java socket writeUTF() and 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM