问题描述
我打开了一个多播套接字并且正在接收多播消息。从这个 thread 来看,同一个多播套接字似乎也应该能够接收单播消息。但是,我什么也得不到。
编辑:端口号似乎有问题。 ws-discovery 使用端口 3702 进行单播,这与我要执行的操作有关。我正在跟踪一个问题,即服务的多播套接字未捕获客户端对服务的探测。我在 Windows 上运行这个。
我的多播服务器:
class Server extends Thread {
MulticastSocket multicastSocket;
final Logger LOG;
final int PORT = 3702;
final String MULTICAST_ADDR = "239.255.255.250";
InetAddress multicastGroup;
public Server() {
LOG = Logger.getLogger("Server");
try {
multicastGroup = InetAddress.getByName(MULTICAST_ADDR);
multicastSocket = new MulticastSocket(PORT);
multicastSocket.setInterface(InetAddress.getLocalHost());
multicastSocket.joinGroup(multicastGroup);
} catch (IOException e) {
e.printstacktrace();
}
}
@Override
public void run() {
while (!Global.exit) {
byte[] buf = new byte[1000];
DatagramPacket recv = new DatagramPacket(buf,buf.length);
try {
multicastSocket.receive(recv);
String msg = new String(recv.getData(),StandardCharsets.UTF_8);
LOG.log(Level.INFO,"got: " + msg);
} catch (IOException e) {
e.printstacktrace();
}
}
}
和客户端代码:
public void directMsgtest(){
try {
DatagramSocket datagramSocket = new DatagramSocket( 8080,InetAddress.getLocalHost());
String msg = "direct msg";
byte[] buf = msg.getBytes();
DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),DST_PORT);
datagramSocket.send(packet);
datagramSocket.close();
} catch (Exception e) {
e.printstacktrace();
}
}
解决方法
看来这是Window的错。它在它的一些服务中使用 WS 发现,因此使用端口 3702 并吃单播数据包发送到端口 3702 而不是将它提供给我的服务器。
我尝试在 Linux 上运行它,结果很好。