在我的程序中,pc会不断向我的Android手机发送数据。每次pc发送62个字节(24个用于头部,38个用于内容)。我的程序运行良好。但有时我的手机可以读取24个字节用于头部,只有10个字节用于内容。
我通过非块socketconnel接收数据。
private SocketChannel client = null;
public int read(byte[] data,int offset, int len){
try {
ByteBuffer buffer = ByteBuffer.allocate(len);
int read_len = client.read(buffer);
if(read_len == 0){
}else if(read_len == -1){
}else{
buffer.flip();
buffer.get(data, offset, read_len);
}
return read_len;
} catch (IOException e) {
e.printStackTrace();
}
return -2;
}
我该如何解决这个问题?
答案 0 :(得分:1)
但有时我的手机可以读取24个字节用于头部,而只有10个字节用于内容。
可能存在网络问题,但我认为由于TCP是面向流的协议(不保留消息边界),因此偶尔会得到与pc发送的字节不对应的有效负载。这是可以预期的。这只意味着你需要做更多的工作。
我假设您的read
消息要继续读取数据,直到您有足够的数据来填充提供的字节数组。试试这个:
public int read(byte[] data, int offset, int len)
{
try
{
ByteBuffer buffer = ByteBuffer.allocate(len - offset);
while (buffer.hasRemaining())
{
int read_len = client.read(buffer);
if (read_len == -1)
return -1;
}
buffer.flip();
int result = buffer.remaining();
buffer.get(data, offset, buffer.remaining());
return result;
}
catch (IOException e)
{
e.printStackTrace();
}
return -2;
}
读入字节缓冲区的好处是它可以在多次读取时正确连接字节,所以只需循环直到满。
BTW - 不要忘记从缓冲区的长度中减去偏移量(如果它不为零)。