我正在用Java编写一个程序,其中两台或多台机器之间使用UDP进行通信。我的应用程序在通过网络将它们序列化到另一台机器之后发送对象,在那里它将被反序列化并处理它。到目前为止,我成功地发送了一种物品。
我的问题是我希望发送者能够发送不同类型的对象,并且接收者能够接收它们并将它们再次转换为适当的类型。但是,由于UDP分配一个字节缓冲区然后将数据接收到缓冲区中,因此不可能转换或检测接收到的对象的类型,因为不同的对象具有不同的大小。
是否有一种方法可以使用UDP发送不同类型的对象,然后在另一端接收它们? (我这里不要求代码,只是一些想法)
由于
修改 我正在寻找发送/接收不同对象类型的最佳方法,而不知道下一个预期对象的类型。假设我有三种对象类型,我希望在任何时候都能收到它们。 在Brian的评论之后,我想到了另一件事:如何为可变大小的数据类型(如字符串,数组等)设置缓冲区大小。在接收UDP数据包时,您首先要分配一个具有接收该对象大小的缓冲区。这与我原来的问题有某种关系。
答案 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也将处理对等通信,例如向尚未收到消息的对等节点发送消息等。