2012-09-04 141 views
2

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

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

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

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

+0

一个字节是*不是您可以发送的最小对象;有一点是。一个字节由8位组成。布尔值相当于字节。使用'writeObject'将导致类,类签名和可序列化字段被写入到流中,所以大小会有所不同;我建议你自己测试一下Byte对象的情况。 – Vulcan

+0

你的意思是一个对象大小是8字节? –

+0

如何发送一个位? – Onca

回答

2

可能既不。首先,将byte自动装箱到Byte。然后将Byte序列化为您的输出流。它可能需要比8个字节多一点发送。我完全不知道规范,但它可能会发送类名java.lang.Byte和字节本身,再加上可能还有几个控制字节。

一个简单的方法来告诉 - 将您的字节序列化为ByteArrayOutputStream,刷新您的ObjectOutputStream,然后查看您的ByteArrayOutputStream结尾的字节数。

+0

'writeObject'发送类名,类签名,对象的可序列化值和流头。你说“不”,所以+1是正确的。 – Vulcan

+0

好吧很有意思。谢谢 – Onca

1

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

enum Control { 
    HEARTBEAT 
} 

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