Java - 通过套接字发送字节对象

时间:2012-09-04 21:35:09

标签: java object byte objectoutputstream

我在我的套接字上使用了ObjectOutputStream,因为我创建了一个需要在客户端和服务器之间传输的新类。 我还创建了一个唯一的线程,它通过流每秒发送一个字节到服务器,以便连续检查连接并检查它是否存活。

byte b=1;
oos.writeObject(b);

我使用“byte”,因为它是我可以发送的最小对象(对吗?),这样服务器就不会读取更长的对象。

我的问题是服务器是读取一个字节对象(字节大小)还是8字节对象(对象大小) ?

2 个答案:

答案 0 :(得分:2)

可能都没有。首先,byte被自动装箱到Byte。然后Byte被序列化为您的输出流。它可能需要超过8个字节才能发送。我不完全知道规范,但它可能发送类名java.lang.Byte和字节本身,加上可能还有一些控制字节。

一种简单的方法 - 将您的字节序列化为ByteArrayOutputStream,刷新ObjectOutputStream,然后查看ByteArrayOutputStream结束的字节数。

答案 1 :(得分:1)

如果必须使用ObjectOutputStream,那么发送哪个对象并不重要,因为在发送第一个对象之后,将来会发送对该对象的引用。出于这个原因,我建议你发送一个特定的枚举。

enum Control {
    HEARTBEAT
}

使用DataOutputStream可以使线格格式小得多,其中1个字节是一个字节。鉴于IP数据包标头大约是20个字节,因此开销是否高于此时,发送1个字节或8个字节并不重要。