2

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

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

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

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

4

2 回答 2

2

可能两者都没有。首先, abyte被自动装箱为 a Byte。然后将Byte其序列化到您的输出流。发送可能需要超过 8 个字节。我不确切知道规范,但它可能会发送类名java.lang.Byte和字节本身,可能还有一些控制字节。

一种简单的判断方法 - 将您的字节序列化为 a ByteArrayOutputStream,刷新您的,然后查看最终有ObjectOutputStream多少字节。ByteArrayOutputStream

于 2012-09-04T21:39:29.860 回答
1

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

enum Control {
    HEARTBEAT
}

您可以使用 DataOutputStream 使线路格式更小,其中 1 字节为 1 字节。鉴于 IP 数据包标头约为 20 字节,发送 1 字节或 8 字节并不重要,因为开销远高于此。

于 2012-09-04T21:52:17.137 回答