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