我正在将SocketChannel
Java类用于客户端/服务器应用程序。我可以发送和检索数据。但如果我的数据包含'\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解码。我怎样才能克服这类问题?
谢谢, 迪帕克
答案 0 :(得分:1)
如果SocketChannel处于非阻塞模式,则读操作不保证读取所有可用数据,也不保证读取任何数据。在上面的情况中,您可能需要多次调用才能读取所有传输的数据。
您需要某种方式让接收代码知道它何时读取了所有数据。这意味着要么让发送方发送有关数据内容的信息(长度等)作为约定协议的一部分,要么只将信道用于一个数据块并读取信道直到它关闭。
答案 1 :(得分:0)
我认为您在分配时遇到ByteBuffer问题。
我之前遇到过SocketChannel的问题,数据似乎已经被搁置了。我建议在ByteBuffer上做一些sysout
while(ByteBuffer.hasRemaining(){
socketChannel.write(buffer) //writing data
System.out.printline(socketChanel.remaining() + " : bytes to go");
}
这可能是朝着正确的方向分离问题的一步。
答案 2 :(得分:0)
如果您按照建议以二进制形式发送数据,则没有理由将\ n与任何其他字节区别对待。如果像图像那样的东西会一直被破坏。如果您使用字符< = 127。
,编码应该没有任何区别我建议您的应用程序不按照您认为的方式工作,并且您正在读取字符串,这些字符串假定在代码中的某处终止。
您可以发布用于编写和读取字符串的代码。即如何确定字符串何时结束?