【问题标题】:Network discovery in Java using multicastingJava中使用多播的网络发现
【发布时间】:2012-11-21 23:49:07
【问题描述】:

我正在尝试制作客户端/服务器 Java 应用程序。客户端和服务器都将在同一个 wi-fi 网络上运行。服务器将在客户端知道的特定端口上运行。

我计划通过网络从客户端发送多播消息,以便该特定端口发现服务器。但是,我不太确定如何找出网络中的哪个 IP 收到了我的消息。

我是否需要在客户端上创建一个套接字并在我发送多播消息后监听传入的数据包以防服务器回复?

提前致谢。

【问题讨论】:

    标签: java networking discovery


    【解决方案1】:

    (1)服务器监听一个预先安排好的端口

    DatagramSocket s = new DatagramSocket(8888);
    s.receive  //(1)
    s.send     //(2)
    

    (3)客户端向广播IP 255.255.255.255的端口发送消息

    DatagramSocket c = new DatagramSocket();
    c.send(255.255.255.255:8888,msg)     //(3)
    c.receive  //(4)
    

    客户端也绑定到一个端口。我们没有指定它,所以它是为我们随机选择的。

    (3) 将消息广播到所有本地机器,(1) 处的服务器接收消息,客户端 IP:port。

    (2) 服务器向客户端IP:port发送响应消息

    (4) 客户端从服务器获取响应消息。

    【讨论】:

    • 我正在使用 OpenJDK 6,而您的 send 调用似乎与我要做的相去甚远。尽管如此,你还是给了我足够的帮助,让我走上了正轨,这真是太棒了。
    • 服务器没有收到客户端的发送。在此处查看代码:gist.github.com/kilaka/5799444
    • 服务器只有在更改客户端后才收到响应,将 255.255.255.255 替换为服务器的 IP 地址。为什么 255.255.255.255 不起作用?
    • 以下效果很好,使用 MulticastSocket:gist.github.com/kilaka/5799664
    【解决方案2】:

    我强烈推荐使用JGroups。它有很多功能,它会做所有的 UDP 事情。 JBoss 将其用于集群。

    【讨论】:

    • 我只需要多播就可以在网络上找到我的服务器。一旦双方相互了解,他们将通过UDP数据报进行通信。 JGroups 的功能似乎比我需要的要多得多,但是由于我找不到其他任何东西,所以我会尝试使用它。谢谢
    【解决方案3】:

    您可以尝试使用 java.net.MulticastSocket(从 Java 1.1 开始提供)。如果您不需要像 jgroupshazelcast 等丰富的库功能集,那么普通的 Java API 可能会为您提供足够好的服务。

    另请参阅示例页面 herehere

    【讨论】:

      【解决方案4】:

      您可以尝试使用SSDP。这是 UPnP 设备用来发现彼此的方法。它在端口 1900 上进行多播,只使用非常简单的数据包来发送 IP 和服务信息。

      Cling 是一个可以从中提取的 UPnP 库。请注意,我不建议您迁移到 UPnP - 只是使用的发现协议。

      【讨论】:

        猜你喜欢
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 2012-01-17
        • 2011-10-30
        • 1970-01-01
        • 2014-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多