我在我的套接字上使用了ObjectOutputStream,因为我创建了一个需要在客户端和服务器之间传输的新类。 我还创建了一个唯一的线程,它通过流每秒发送一个字节到服务器,以便连续检查连接并检查它是否存活。
byte b=1;
oos.writeObject(b);
我使用“byte”,因为它是我可以发送的最小对象(对吗?),这样服务器就不会读取更长的对象。
我的问题是服务器是读取一个字节对象(字节大小)还是8字节对象(对象大小) ?
答案 0 :(得分:2)
可能都没有。首先,byte
被自动装箱到Byte
。然后Byte
被序列化为您的输出流。它可能需要超过8个字节才能发送。我不完全知道规范,但它可能发送类名java.lang.Byte
和字节本身,加上可能还有一些控制字节。
一种简单的方法 - 将您的字节序列化为ByteArrayOutputStream
,刷新ObjectOutputStream
,然后查看ByteArrayOutputStream
结束的字节数。
答案 1 :(得分:1)
如果必须使用ObjectOutputStream,那么发送哪个对象并不重要,因为在发送第一个对象之后,将来会发送对该对象的引用。出于这个原因,我建议你发送一个特定的枚举。
enum Control {
HEARTBEAT
}
使用DataOutputStream可以使线格格式小得多,其中1个字节是一个字节。鉴于IP数据包标头大约是20个字节,因此开销是否高于此时,发送1个字节或8个字节并不重要。