- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何停止该方法的执行?
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/
如果数据是从另一台计算机(首先)“发送”的,我如何设置我的套接字例程以“发送”(首先)或(切换)“接收”? 谢谢 通用代码: -(void) TcpClient{ char buffer[12
我正在尝试在代码中使用 Java 8 方法引用。有四种类型的方法引用可用。 静态方法引用。 实例方法(绑定(bind)接收者)。 实例方法(未绑定(bind)接收者)。 构造函数引用。 使用静态方法引
我正在尝试在我的代码中使用 Java 8 方法引用。有四种类型的方法引用可用。 静态方法引用。 实例方法(绑定(bind)接收器)。 实例方法(UnBound 接收器)。 构造函数引用。 使用静态方法
这个问题在这里已经有了答案: X does not implement Y (... method has a pointer receiver) (4 个答案) 关闭 3 年前。 最近在研究Iri
我把这个问题/错误发布到 GIT 官方 channel ,但没有得到任何回应。希望这里有人可以帮助我。 当 receive.denyCurrentBranch 设置为 updateInstead 并且
我正在开发一个新的监控系统,该系统可以测量 Celery 队列吞吐量并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的奇怪行为(并且在 Celery 规范中没有详细记录)。 出于测试
我正在开发一个新的监控系统,该系统可以测量 Celery 队列吞吐量并在队列备份时帮助提醒团队。在我的工作过程中,我遇到了一些我不理解的奇怪行为(并且在 Celery 规范中没有详细记录)。 出于测试
这个问题在这里已经有了答案: What does this Google Play APK publish error message mean? (17 个答案) 关闭 3 年前。 我为我的应用程
我正在寻找一种解决方案来从我的 child “药物”中获取数据,并使用 ID 从“medication_plan”节点接收特定数据并将它们显示在 Recyclerview 中。 数据库结构: 目前我正
我正在构建 DNN 来预测对象是否存在于图像中。我的网络有两个隐藏层,最后一层看起来像这样: # Output layer W_fc2 = weight_variable([2048, 1])
我有一个模拟销售漏斗的 WF4 服务。它的工作原理是从“注册”接听电话开始。之后,有 10 个类似的阶段(每个阶段包含 2 个接收)。在当前阶段验证接收到的数据之前,您不能前进到一个阶段。但我不确定的
我有一个用 NSubstitute 伪造的对象,它有一个被调用两次的方法。我想验证该方法实际上已被调用两次(且仅调用两次)。我浏览了文档和谷歌,但没有运气。任何帮助,将不胜感激。谢谢。 最佳答案 NS
我在 Windows 上使用 D 编写了一个套接字服务器,现在我想将它移植到 Linux 上。这是代码摘要: /* * this.rawsocks - SocketSet * this.serve
我有一个在 AndroidManifest.xml 中定义了 Receiver 的应用程序,它似乎随机地被禁用,这导致应用程序强制关闭,直到重新安装应用程序。在发生这种情况之前,应用可能会在一天、一周
我正在尝试使用 android 注释库通过两种方式进行广播接收器,但 ide 无法识别此代码中的 @Receiver 或 @ReceiverAction import android.content.
我正在试验 Android 的 LiveData .我只是试图将大量通知推送给观察 LiveData 对象的观察者。我让一个线程在后台运行,在一个 while 循环中,我不断地通过 LiveData
当我运行以下代码时: [Test] public async Task Can_Test_Update() { var response = await _controller.UpdateA
查看 header 时,似乎第二台接收邮件的服务器直到最终 header 中报告的送达日期之后才转发它。 在 c9mailgw11.amadis.com,报告的时间是 22:47:49 -0800
我在这里搜索了几个问题都没有得到答案,所以我会根据我的具体情况询问。 真正简单的接收后 Hook ,它只是 curl 到 Redmine 以强制 Redmine 在提交时更新 repo 的 View
我目前正在尝试 Elixir。我对 Ruby 或函数式编程的经验很少,所以我不太熟悉语法。我在读Learn Elixir in Y minutes其中一个例子让我有点困惑。起初,指南显示了 case
我是一名优秀的程序员,十分优秀!