3

我正在将SocketChannelJava 类用于客户端/服务器应用程序。我可以发送和检索数据。但如果我的数据包含'\n',那么我不会读取正确的数据。例如

sending data = "Hi dear"
receiving data = "Hi dear"

sending data = "Hi dear\n\n i am fine"
receiving data = "Hi dear"

sending data = "Hi dear\\n\\n i am fine"
receiving data = "Hi dear\n\n i am fine"


ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = socketChannel.getChannel().read(byteBuffer);

我正在使用 US-ASCII 解码。我怎样才能克服这种类型的问题?

谢谢,迪帕克

4

3 回答 3

1

如果 SocketChannel 处于非阻塞模式,读操作不保证读取所有可用数据,也不保证读取任何数据。在上述情况下,您可能需要多次调用才能读取所有传输的数据。

您需要某种方式让接收代码知道它何时读取了所有数据。这意味着要么让发送方发送有关数据内容(长度等)的信息,作为商定协议的一部分,要么只使用 Channel 处理一个数据块并读取 Channel 直到它关闭。

于 2009-05-18T05:05:04.170 回答
0

我认为您在分配时遇到了 ByteBuffer 问题。

我之前遇到过 SocketChannel 的问题,数据似乎被阻止了。我建议在 ByteBuffer 上做一些系统输出

while(ByteBuffer.hasRemaining(){
    socketChannel.write(buffer) //writing data
    System.out.printline(socketChanel.remaining() + " : bytes to go");
}

这可能是朝着隔离问题的正确方向迈出的一步。

于 2009-05-18T05:02:47.883 回答
0

如果您按照建议以二进制形式发送数据,则没有理由将 \n 与任何其他字节区别对待。如果是图像之类的东西,就会一直被破坏。如果您使用字符 <= 127,则编码不应该有任何区别。

我会建议您的应用程序没有按照您认为的方式工作,并且您正在阅读假设代码中某处出现 \n 终止的字符串。

您可以发布用于编写和读取字符串的代码吗?即你如何确定字符串何时结束?

于 2009-05-18T06:15:37.143 回答