在我的系统中,我使用tcp在Android应用程序和桌面应用程序(在Qt中开发)之间传输消息。
我正在使用hash
库来序列化/反序列化两个应用程序中的结构。为了确保结构总是作为一个整体被接收,我总是发送字节数(编码为32位大端无符号整数,不使用msgpack
,这样它总是占用前4个字节)在消息本身之前(在msgpack
中编码)。如果有更好的方法请告诉我。
在Android应用程序中,我将前4个字节读入msgpack
并将其解码为byte[]
,接下来我需要一种方法让线程保持阻塞直到下一个long msgSize
接收到的字节数。在阅读其他问题和答案后,我想我可以这样写:
msgSize
之后我可以将msg数组与msgpack一起使用,我确信收到了整条消息。
所以:
InputStream is= sock.getInputStream();
byte[] msgSizeBuff= new byte[4];
is.read(msgSizeBuff, 0, 4);
long msgSize= MyDecodeFunction(msgSizeBuff);
DataInputStream dis = new DataInputStream(is);
byte[] msg = new byte[msgSize];
dis.readFully(msg);
类的使用,我保证我会等到收到指定的字节数吗?因为他们在reference说:如果字节不足,则抛出EOFException。
DataInputStream
或socket.close()
会发生什么,我会得到一个例外吗?