我有一个网络套接字读取,在以下情况下工作正常:
发件人发送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!
答案 0 :(得分:1)
我会设计一个应用程序包结构,将长度字段作为要接收的第一个字节。这将允许接收器了解进入的字节数并相应地进行规划。
只需创建一个如下所示的结构:
length
:正在发送的邮件的长度。payload
:正在发送的大小为length
您可以将payload
结构化为仅仅byte[]
更具描述性;创建一个代表您的消息的Serializable
类。
一旦你有一个定义良好的应用程序包,创建一个解析器,了解接收器的数据包结构。然后,此解析器将接收第一个或多个字节,并知道这些字节代表length
的{{1}}。然后它将相应地读取payload
。如果payload
与payload
不匹配,则数据包无效。
如果你被迫只使用length
,你可以这样做:
char[]
请注意char[] message = { 0x05, 'h', 'e', 'l', 'l', 'o' }; // 0x05 is the length field
如何不包含在字节数中。
这种设计可用于任何通信平台:从嵌入式系统中的RF收发器到Android上的TCP通信。