gpt4 book ai didi

java - android无法接收从pc发送的所有数据

转载 作者:可可西里 更新时间:2023-11-01 02:52:35 27 4
gpt4 key购买 nike

在我的程序中,pc 不断地向我的android 手机发送数据。每次 pc 发送 62 个字节(头部 24 个,内容 38 个)。我的程序运行良好。但有时我的手机可以读取 24 个字节的头部,而只能读取 10 个字节的内容。

我通过非阻塞套接字 channel 接收数据。

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;
}

我该如何解决这个问题?

最佳答案

But sometimes my phone can read 24 bytes for head and only 10 bytes for content.

可能存在网络问题,但我认为更有可能是因为 TCP 是面向流的协议(protocol),它不保留消息边界,因此您偶尔会收到与 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;
}

读入字节缓冲区的好处在于它负责在多次读取时正确连接字节,因此只需循环直到读满。

顺便说一句 - 不要忘记从缓冲区的长度中减去偏移量(如果它不为零)。

关于java - android无法接收从pc发送的所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13813115/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com