java socket writeUTF()和readUTF()

时间:2010-10-24 16:33:26

标签: java sockets

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

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


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

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

3 个答案:

答案 0 :(得分:27)

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

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

答案 1 :(得分:1)

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

这应该意味着读取操作将一直等到获取足够的字符才能返回字符串..这意味着如果你没有看到它们,它们实际上也是分段的,因为你只是用{来装饰套接字的流{1}}和DataInputStream

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

答案 2 :(得分:0)

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

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