【问题标题】:Java MulticastSocket. How to stop/pause the "receive" methodJava 多播套接字。如何停止/暂停“接收”方法
【发布时间】:2014-10-12 19:45:58
【问题描述】:

如何阻止此方法执行?

multSocket.receive(multPacket);    

我正在尝试使用 Java 通过 UDP 多播连接两台或多台机器(或同一台机器上的应用程序)。问题是我不是在使用客户端-服务器,而是更像一个分布式对象,所以客户端和服务器之间没有真正的区别。

理想情况下,第一个打开的应用程序会每隔 x 秒开始发送多播消息,当另一个应用程序启动时,会调用一个方法来接收消息或数据包。但由于每个应用程序都可以是客户端或服务器,因此很难知道要发送哪个应用程序以及接收哪个应用程序。

我目前解决此问题的想法是让每个应用程序发送多播数据包 10 秒,如果没有人响应,则侦听多播数据包 10 秒,如果没有收到任何内容,则重新开始发送并保持循环。当其中一个最终收到消息时,向发送者发送确认,他们都可以停止收听和发送。

但我的问题是接收方式。它一直在监听传入的多播数据包,我不知道如何停止或暂停它。

这是我初始化套接字的方式,以防万一

MulticastSocket multSocket = new MulticastSocket(5001);
multSocket.joinGroup(230.0.0.1);
private byte[] multBuf = new byte[256];
DatagramPacket multPacket = new DatagramPacket(multBuf, multBuf.length);

感谢您听到我的声音。

----------------------------------- - - - - - - - - 编辑 - - - - - - - - - - - - - - - - - ----------------------------------------

----------------------------------- - - - - - - - - 编辑 - - - - - - - - - - - - - - - - - ----------------------------------------

@EJP 感谢您的回答!这就是我在接收多播方法上实现 setSoTimeout 的方式:

public void receiveMulticast() throws IOException{

    multAddress = InetAddress.getByName("230.0.0.1");
    multSocket = new MulticastSocket(multPort);
    multSocket.joinGroup(multAddress);
    multBuf = new byte[256];
    multPacket = new DatagramPacket(multBuf, multBuf.length);

    multSocket.setSoTimeout(10000);

    try {
        // This is the sentence I had trouble with
        multSocket.receive(multPacket);

        receivedPacket = true;
        System.out.println("Received something");

    } catch (SocketTimeoutException s) {
        System.out.println("Socket timed out!");
    }

}

如果有人好奇,这里有更多代码:

这是我的发送多播方法,它使用睡眠每 10 秒发送一次:

public void sendMulticast() throws IOException, InterruptedException{

    multAddress = InetAddress.getByName("230.0.0.1");
    multSocket = new MulticastSocket();
    multSocket.joinGroup(multAddress);
    int tcpPort = 5001;
    String data = String.valueOf(tcpPort);
    multBuf = data.getBytes();
    multPacket = new DatagramPacket(multBuf, multBuf.length, multAddress, multPort);

    int count = 0;
    while (count < 10) {
        Thread.sleep(1000);
        multSocket.send(multPacket);
        count++;
    }

}

这就是我无限调用这两个方法的地方(在另一个类上):

messageThread = new Thread() {
    @Override
    public void run() {
        while(true){
            try {
                stateLabel.setText("Sending");
                socket.sendMulticast();
                stateLabel.setText("Listening");
                socket.receiveMulticast();
            } catch (IOException ex) {
                Logger.getLogger(NumerosAmigosView.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InterruptedException ex) {
                Logger.getLogger(NumerosAmigosView.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
};
messageThread.start();

所以结果是程序无限运行,发送一个数据包 10 秒,接收 10 秒并重新开始。 当我同时运行两个程序时,会收到数据包:)。

【问题讨论】:

    标签: java sockets udp multicast


    【解决方案1】:

    使用setSoTimeout() 设置读取超时,并捕获抛出的SocketTimeoutException

    【讨论】:

    • 您的回答有帮助。我有一个新的疑问,而不是一个问题,因为该程序运行良好。我编辑了我的问题并添加了更多代码。这段代码是通过修改一个简单的客户端服务器通信来完成的,在调用 sendMulticast 或 receiveMulticast 之前的 messageThread 部分有这样一行: Thread.currentThread().interrupt();我不得不删除它,因为它弄乱了我的睡眠句子。该行对我的代码有何帮助?我应该尝试以另一种方式实现它吗?或者也许添加 multSocket.setSoTimeout(10000) 而不是 sleep (我试过了,但无法让它工作)。
    • @somezombie 为什么要睡觉?更不用说中断了?只要坚持我在回答中所说的话。
    猜你喜欢
    • 2011-04-29
    • 2018-11-20
    • 2012-01-08
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2023-02-22
    相关资源
    最近更新 更多