我一直在阅读一些Java套接字代码片段,并且说明了在套接字通信中,为了按顺序发送消息,您不必手动分离它们,编写器/读取器流会自动执行以下操作您。这是一个例子:
writer.java
writeUTF("Hello");
writeUTF("World");
reader.java
String a=readUTF(); // a=Hello
String a=readUTF(); // b=World
我已尝试过此代码段,但效果很好。但是,我想知道这种编码风格是否应该正常工作。是否存在按顺序使用套接字流而不明确分离每个分段的潜在风险?
答案 0 :(得分:27)
writeUTF()
和readUTF()
写入字符串的长度(以字节为单位,编码为UTF-8时),后跟数据,并使用modified UTF-8编码。所以有一些潜在的问题:
答案 1 :(得分:1)
根据文档,readUTF
和writeUTF
方法使用UTF8的修改版本,该版本还添加了要在beginnig中读取的字符的长度。
这应该意味着读取操作将一直等到获取足够的字符才能返回字符串..这意味着如果你没有看到它们,它们实际上也是分段的,因为你只是用{来装饰套接字的流{1}}和DataInputStream
。
总之,是的,它应该是非常安全的,因为API本身将负责分离单个消息。
答案 2 :(得分:0)
java.net.Socket
工作正常,流等待readUTF();
但是当使用mina的CumulativeProtocolDecoder
时,它不会抛出java.io.EOFException