0

假设我想在两个使用 TCP 套接字的 java 程序之间发送许多消息。

我认为最方便的方法是发送对象,例如:

PrintStream ps = new PrintStream(s.getOutputStream());

ObjectOutputStream oos = new ObjectOutputStream(ps);

  some_kind_of_object_here;

  oos.writeObject(some_kind_of_object_here);

 ps.print(oos);

我想发送字符串、数字、HashMap、布尔值 如何使用可以存储所有属性的 fx 1 对象来做到这一点?我认为 ArrayList 是可序列化的,我们可以把所有东西都放在那里,但这不是优雅的方式。我想发送不同类型的数据,因为用户可以从服务器可以为它做的各种选项中进行选择。有什么建议吗?

4

4 回答 4

2

您是否考虑过使用 RMI?

否则,如果您需要额外的性能,请坚持使用Serializable或什至。Externalizable

您不需要像 Lists 这样的包装类。当然,您可以构建自己的包装对象,将所有相关数据保存在一起。这样的“应用程序数据单元”将帮助您处理发送实体的正确顺序。只要所有成员都是 Serializable,一旦将包装对象放入对象流中,完整的对象图就会自动序列化。

如果您不使用包装类,只需确保要传输的每个对象/类型至少实现Serializable. 然后您必须验证数据发送的顺序是否与您除了数据到达的顺序一致。

于 2010-05-01T11:06:44.513 回答
1

以您编写代码的方式,您已经可以发送任何Java 对象。当然,这些对象包括“字符串、数字、哈希映射、布尔值”。

只需写入 ByteArrayOutputStream:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.write(javaObject);
oos.close();
socket.write(baos.toByteArray())
于 2010-05-01T12:26:19.113 回答
1

大师,您知道您可以通过套接字将任何可序列化对象发送到另一个 JVM,是吗?

如果是这样,最简单的方法是拥有一个包含所有对象的可序列化对象,然后转发它。对象列表可能是最简单的。然后,您可以在另一端反序列化它,并以您需要的任何方式处理列表中的对象。

我建议您阅读 Java 中的序列化技术,以便了解您可以做的所有智能事情。

http://java.sun.com/javase/7/docs/technotes/guides/serialization/index.html

于 2010-05-01T13:45:12.933 回答
0

如果您需要保持数据包较小,您可以使用 plain Object[],在其中放置您想要的任何内容并使用指定数据包类型的枚举,允许您在消息中存储多少和哪些类型的对象。

class Message
{
  Type t;
  Object[] params;
}

当然,您必须根据Type t选择处理每个数据包的方式进行切换,但是由于协议通常是 FSM(这取决于您正在编码的内容),因此这会很好地工作,而不会浪费太多空间或在不需要时分配列表。

于 2010-05-01T11:27:21.407 回答