【问题标题】:Java - Sending byte object over socketJava - 通过套接字发送字节对象
【发布时间】:2012-08-29 14:18:14
【问题描述】:

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

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

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

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

【问题讨论】:

  • 一个字节不是你可以发送的最小对象;有点是。一个字节由 8 位组成。布尔值等价于字节。使用writeObject 将导致类、类签名和可序列化字段也写入流,因此大小会有所不同;对于 Byte 对象,我建议您自行测试。
  • 你的意思是一个对象的大小是 8 字节?
  • 不幸的是,您无法在 Java 中发送/接收一位。您可以做的最好的事情是将 8 个单独的位打包成一个字节并发送该字节并解压缩另一侧的位,这可用于在一个字节中发送多达 8 个真/假 (1/0) 值8 个字节的值 1 或 0。

标签: java object byte objectoutputstream


【解决方案1】:

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

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

【讨论】:

  • writeObject 发送类名、类签名、对象的可序列化值和流标头。你说“都不是”是正确的,所以+1。
【解决方案2】:

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

enum Control {
    HEARTBEAT
}

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

【讨论】:

    猜你喜欢
    • 2014-01-11
    • 2021-01-11
    • 2012-03-13
    • 2015-08-31
    • 1970-01-01
    • 2014-03-24
    • 2017-03-20
    • 1970-01-01
    相关资源
    最近更新 更多