2010-05-29 135 views
0

我正在用Java编写一个程序,其中两台或多台使用UDP的机器之间进行通信。我的应用程序在通过网络将它们序列化到另一台机器之后发送对象,在这台机器上它将被反序列化并处理它。到目前为止,我成功地发送了一种物体。使用java通过UDP发送/接收不同的对象

我的问题是我希望发件人能够发送不同类型的对象,并使接收者能够接收它们并将它们再次转换为适当的类型。但是,由于UDP分配了字节缓冲区,因此将数据接收到缓冲区中,因为不同的对象具有不同的大小,所以不可能投射或检测接收到的对象的类型。

是否有一种方法可以用来使用UDP发送不同类型的对象,然后在另一端接收它们? (我不要求代码在这里,只是一些想法)

感谢

编辑: 我要找发送/接收不同类型的对象不知道是什么的类型的最佳方式下一个预期对象。假设我有三种对象类型,我希望在任何时候都能收到它们中的任何一种。 布赖恩的评论之后,我又想到了另一件事:如何为可变大小的数据类型(如字符串,数组等)设置缓冲区大小。当接收到一个UDP数据包时,您首先要分配一个大小的缓冲区来接收该对象。这与我原来的问题有某种关系。

+0

发布一些代码会很有用。对象的内容大小可能会有所不同,而不是因为它们的类型。 – 2010-05-29 14:18:41

+0

难道你不使用buildin java序列化?在这种情况下:只需从内容中发送类名称,以便接收方可以处理它。 – Daniel 2010-05-29 14:48:17

+0

@Brian:是的,但如果我只在对象中使用原始数据类型,那么这不会是一个真正的问题。 @Daniel:不,我在这里使用内置的一个。 – AAA 2010-05-29 20:13:48

回答

2

为什么不把它们包装成一个已知类型(Packet),其有效载荷类型为Object?然后,您可以对您的Packet进行反序列化并询问其类型的结果负载。

2

你可以序列化(使用ObjectOutputStream),也可以反序列化(使用ObjectInputStream)。然后您检索一个对象。如果通过UDP,TCP,管道,本地文件或其他方式传输它,它不起作用。序列化写入OutputStream,反序列化从InputStream读取。

您myObject.getClass()检测您收到的内容。

+0

对于特定的对象,序列化,发送,接收和反序列化都已成功完成。我正在寻找发送/接收不同对象类型的最佳方式,而不知道下一个预期对象的类型。假设我有三种物体类型,我希望在任何时候都能接收其中的一种物体。 – AAA 2010-05-29 20:20:47

0

基本上,它是反序列化的对象,然后执行instanceof检查。然而,由于您使用UDP时明确提到的字节缓冲区的问题,我建议看看一个消息库这已经执行这种字节的缓冲区管理:JGroups

在伪代码,有工作JGroups的看起来像这样:

JChannel channel = new JChannel("myapp"); 
Customer c = new Customer("IniTrodeInc.); 
Book b = new Book("Twilight"); 
channel.send(new Message(c)); 
channel.send(new Message(b)); 

而且在接收端

JChannel channel = new JChannel("myapp"); 
channel.addListener(new Listener(){ 
public void onMessage(Message m) { 
    if (m.getObject() instanceof Customer) { 
    handleNewCustomer((Customer)m.getObject())); 
    } else if (m.getObject() instanceof Book) { 
    handleNewBook((Book)m.getObject())); 
    } else { 
    // Ups, we received s.t.h else 
    } 
} 
}); 

JGroups的自动执行消息传递信道的抽象概念,Y您不需要知道这是UDP,TCP还是多播等.JGroups也将处理对等通信,例如,将消息发送给还没有收到消息的对等节点等。