【问题标题】:Using java to send/receive different objects through UDP使用java通过UDP发送/接收不同的对象
【发布时间】:2010-05-29 14:12:51
【问题描述】:

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

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

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

谢谢

编辑: 我正在寻找发送/接收不同对象类型的最佳方法,而不知道下一个预期对象的类型。假设我有三种对象类型,我希望在任何时间都能收到其中任何一种。 在 Brian 发表评论后,我想到的另一件事是:如何为可变大小的数据类型(如字符串、数组等)设置缓冲区大小。与接收 UDP 数据包时一样,您必须首先分配一个大小以接收该对象的缓冲区。这在某种程度上与我原来的问题有关。

【问题讨论】:

  • 发布一些代码会很有用。对象的内容可能会在大小上有所不同,而不是因为它们的类型。
  • 会不会是你没有使用内置java序列化?在这种情况下:只需从内容中发送类名,以便接收者处理它。
  • @Brian:是的,但如果我在对象中只使用原始数据类型,那么这不是一个真正的问题。 @Daniel:不,我在这里使用内置的。

标签: java object udp serialization


【解决方案1】:

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

你 myObject.getClass() 来检测你收到了什么。

【讨论】:

  • 针对特定对象的序列化、发送、接收和反序列化都已成功完成。我一直在寻找发送/接收不同对象类型的最佳方法,但不知道下一个预期对象的类型是什么。假设我有三种对象类型,我希望在任何时候都能收到其中一种。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    基本上,它是反序列化对象,然后执行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 自动执行消息传递通道的抽象,您不需要知道这是 UDP、TCP 还是多播等。JGroups 还将处理对等通信,例如向尚未收到消息的对等节点发送消息等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 2016-02-02
      • 2017-09-27
      相关资源
      最近更新 更多