使用java通过UDP发送/接收不同的对象

时间:2010-05-29 14:12:52

标签: java object udp serialization

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

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

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

由于

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

3 个答案:

答案 0 :(得分:2)

为什么不将它们包装在具有Packet类型的有效负载的已知类型(Object)中?然后,您可以对Packet进行反序列化,并询问生成的有效负载的类型。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

在伪代码中,使用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自动执行消息传递通道的抽象,您不需要知道这是UDP,TCP还是多播等.JGroups也将处理对等通信,例如向尚未收到消息的对等节点发送消息等。