Android Socket读取缓冲区大小问题

时间:2014-01-15 13:03:39

标签: android tcp

我有一个网络套接字读取,在以下情况下工作正常:

发件人发送size_t的字节。 Receiver知道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。虽然使用循环是因为read不会在一次尝试中抓取整个数据,这与写操作不同! 现在,如果发送者每次发送可变数量的数据(接收者不知道),则上述代码不会出现在wuile循环中。此外,如果我只是给inputStream.read(buffer,current,1024-current));它似乎只读取高达1024字节并且循环出来。

我想收到1kb to 500kb范围内的可变数据量。我如何使用普通的char []数组和TCP套接字(也是UDP)但不使用NIO ByteBuffers!

1 个答案:

答案 0 :(得分:1)

我会设计一个应用程序包结构,将长度字段作为要接收的第一个字节。这将允许接收器了解进入的字节数并相应地进行规划。

只需创建一个如下所示的结构:

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

您可以将payload结构化为仅仅byte[]更具描述性;创建一个代表您的消息的Serializable类。

一旦你有一个定义良好的应用程序包,创建一个解析器,了解接收器的数据包结构。然后,此解析器将接收第一个或多个字节,并知道这些字节代表length的{​​{1}}。然后它将相应地读取payload。如果payloadpayload不匹配,则数据包无效。

如果你被迫只使用length,你可以这样做:

char[]

请注意char[] message = { 0x05, 'h', 'e', 'l', 'l', 'o' }; // 0x05 is the length field如何不包含在字节数中。

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