繁体   English   中英

Android无法接收从PC发送的所有数据

[英]android can not receive all data sent from pc

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

我通过无阻塞套接字通道接收数据。

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

我怎么解决这个问题?

但是有时候我的手机可以读取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;
   }

读入字节缓冲区的好处是,它可以在多次读取时正确地串联字节,因此只需循环直到满。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM