Java中的UDP广播客户端

时间:2015-05-20 21:33:59

标签: java sockets udp

我正在使用UDP广播进行服务间通信服务器是Python的,我可以使用以下代码查看UDP消息:

import sys
import socket

HOST = ''
PORT = 9002

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.bind((HOST,PORT))

while True:
    try:
        message = s.recv(8192)
        print("Got data: " + message)
    except KeyboardInterrupt:
        sys.exit()

我可以在同一台机器上同时运行这些客户端。

我正在尝试使用DatagramSocket类在Java中实现类似的客户端,但我不断收到“已在使用的地址”错误。显然我需要以与目前不同的方式构建它:

DatagramSocket socket = new DatagramSocket(broadcastPort);

是否可以获得与Python代码相同的行为?

2 个答案:

答案 0 :(得分:4)

试试这个:

// create an unbound socket
DatagramSocket socket = new DatagramSocket(null);

// make it possible to bind several sockets to the same port
socket.setReuseAddress(true);

// might not be necessary, but for clarity
socket.setBroadcast(true);

socket.bind(new InetSocketAddress(9002));

构造函数的null参数是这里的关键。这种智慧隐藏在DatagramSocket(SocketAddress bindAddress)构造函数的javadoc的第二段中:

  

如果地址为null,则创建未绑定套接字。

答案 1 :(得分:1)

已使用的地址可能意味着您未正确终止您的计划。如果您正在使用Eclipse,请确保检查所有打开的控制台并终止所有控制台。 (右上角,蓝色框 - 单击它,它将显示所有正在运行的程序)

在Eclipse中,只是因为你再次“运行”你的程序,它不会终止前一个程序。

另一个可能的问题是您可能使用与python服务器相同的端口。 2应用程序无法声明相同的端口,因此只需更改端口号即可。

修改:使用 MulticastSocket