2010-05-01 73 views
0

我们假设我想在两个使用TCP套接字的java程序之间发送很多消息。在java中通过tcp/ip进行通信的数据结构是什么?

我认为最convienient方法是发送对象,如:

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,我们可以放在那里一切,但不是优雅的方式。 我想发送不同类型的数据,因为用户可以从服务器可以为其执行的各种选项中进行选择。 有何建议?

+0

我的建议:试试看看它是如何工作的! – 2010-05-01 12:33:12

+0

我想 和问题是,我不知道如何阅读对象(我的新类) 我可以将它转换为一些相同的类,但如此失败 – questioner 2010-05-01 13:27:17

回答

1

主人,你知道你可以在一个插座发送任何序列化的对象到另一个JVM,是吗?

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

我建议你阅读Java中的序列化技术,这样你就可以知道所有你可以做的聪明事情。

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

+0

这是很好的链接,我已经找到了有趣的东西 – questioner 2010-05-01 14:02:31

2

您是否考虑过使用RMI?

否则坚持Serializable甚至Externalizable,如果你需要额外的表现。

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

如果你不使用包装类,只要确保你想要传递的每个对象/类型至少实现Serializable。然后,您必须验证数据发送的顺序是否与除您要到达的数据之外的顺序相符。

+0

是的UUID是不一样的,我想用这1个大对象来存储所有信息,但我不知道如何读它的另一面, 我可以使类具有相同的字段,但UUID(或某事像那个)将不会匹配 – questioner 2010-05-01 13:19:21

+0

Java那样所有的东西对你喜欢这里:除了在在使用了哈希表像的http://www.java2s.com/Code/Java/Network-Protocol/ServeentireobjectsusingObjectOutputStream.htm,使用任意的类,它必须在类路径中存在两个节点。 – 2010-05-01 13:20:54

+0

还是我误读了?你的问题是你创建对象的副本?然后使用RMI并导出您的对象。 – 2010-05-01 13:23:04

0

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

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

你将不得不根据Type t选择如何处理每一个数据包时做切换,但由于协议通常是有限状态机(这取决于你在编码的),这将很好地工作,而不会浪费太多空间或者在不需要时分配列表。

+0

如果你想那样做,使用序列化[]代替。但是我在这里看不到这一点。只需使用常规课程并将我们的值添加为成员即可。使用这个数组/列表只会增加一个开销,当你需要在解编时将这些类型转换回原来的类型。 – 2010-05-01 11:36:39

+0

是,序列化是确定的(但它只是一种约束,它并不真正意味着什么)!在任何情况下,你可以不喜欢晴建议,如果你没有很多种不同PARAMS /类型则params的不同包。 – Jack 2010-05-01 11:42:00

+0

当然是有区别的。如果你把一个不可序列化的对象放入数组中,它在编译时会失败。在你的版本中,它在编组期间会失败 - 这是不好的。 – 2010-05-01 11:46:10

1

你写代码的方式,你已经可以发送任何 Java对象。这些对象当然包括“字符串,数字,HashMaps,布尔值”。

刚刚写入ByteArrayOutputStream:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.write(javaObject); 
oos.close(); 
socket.write(baos.toByteArray()) 
+0

无需ByteArrayOutputStream,ObjectOutputStream自动处理所有这些东西。 – 2010-05-01 12:28:59

+0

我知道如何发送这种类型的对象,但我想发送所有这些字符串,数字,HashMaps,1个对象中的布尔值,只使用: oos.write(This_1_big_powerfull_object); – questioner 2010-05-01 13:16:28

相关问题