0

我打开了一个多播套接字并正在接收多播消息。从这个线程,似乎同一个多播套接字也应该能够接收单播消息。但是,我什么也得不到。

编辑:端口号似乎是问题。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();
    }
}
4

1 回答 1

0

看来这是Window的错。它在其某些服务中使用 WS 发现,因此使用端口 3702 并食用发送到端口 3702 的单播数据包,而不是将其提供给我的服务器。

我尝试在 Linux 上运行它,它很好。

于 2021-01-10T22:04:59.033 回答