有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 安卓无法接收pc发送的所有数据

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

我通过非块socketchannel接收数据

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

我怎样才能解决这个问题


共 (1) 个答案

  1. # 1 楼答案

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

    可能存在网络问题,但我认为更有可能的是,由于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;
       }
    

    读入字节缓冲区的好处在于,它能在多次读取时正确连接字节,所以只需循环直到完全

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