tcp - Android套接字读取缓冲区大小问题

  显示原文与译文双语对照的内容

我已经阅读了一个网络套接字,在以下情况下可以正常工作:

发送方发送 size_t 字节。 接收者知道size_t的值,并使用


do {
 long tse = System.currentTimeMillis();
 bytesRead = inputStream.read(buffer,current,buffer.length-current));
 Log.e("time-spent",String.valueOf(System.currentTimeMillis()-tse));

 if(bytesRead> = 0) {
 current += bytesRead
 }
} while(bytesRead> 0);

其中 buffer的大小为 size_t 。 由于使用了循环,因这里读取不会在不同于写入的情况下抓取整个数据 ! 现在如果发送方每次发送可变量的数据,这是接收者不知道的,上面的代码不会从wuile循环中出来。 如果我给出 inputStream.read(buffer,current,1024-current)); 它看起来只读 1024字节,并且从循环中出来。

我想从 1kb to 500kb 接收可变数量的数据。 如何使用普通字符 [] 数组和TCP套接字( 同样也 UDP ),但不能使用 NIO ByteBuffers !

时间: 作者:

为了将长度字段作为接收到的第一个字节,我将设计一个应用程序包结构。 这样接收器就可以理解有多少字节正在进入并相应地计划。

简单地创建一个类似这样的结构:

  • length: 正在发送的消息的长度。
  • payload: 正在发送的数据大小为 length

你可以将 payload 构造成一些描述性,比 byte[] 更有描述性;制作一个表示消息的类。

一旦你有了一个定义好的应用程序包,就创建了一个解析器,该解析器。 这个解析器将接收第一个字节或者字节,并知道这些字节表示 payloadlength 。 然后它将相应地读取 payload 。 如果 payload 不 MATCH,则数据包无效。

如果你被迫使用 char[],你可以执行如下操作:

char[] message = { 0x05, 'h', 'e', 'l', 'l', 'o' };//0x05 is the length field

注意在字节数中不包括自身。

这种设计可以在任何通信平台上使用: 从嵌入式系统中的射频收发器到Android上的TCP通信。

...