gpt4 book ai didi

Java 多播套接字。如何停止/暂停 "receive"方法

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:32 24 4
gpt4 key购买 nike

如何停止该方法的执行?

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!");
}

}

这里有更多代码,以防有人好奇:

这是我的发送多播方法,它使用 sleep 每 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 秒,然后重新开始。当我同时运行两个程序时,会收到数据包:)。

最佳答案

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

关于Java 多播套接字。如何停止/暂停 "receive"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26329262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com