我正在为网络类编写 UDP 客户端-服务器对,但我遇到了一个问题。这是一个相当不正统的网络作业,所以先了解一下背景:
目标是创建一个服务器来实现基于推送的通知。这里的关键点是服务器 必须通过它最后看到的任何地址联系客户端,并监听客户端的控制数据包。因此,我有一个在客户端上运行的线程,它定期向服务器发送 UDP 数据包,当它需要发送响应时记录它们的来源。当发送刷新地址转换时,这种技术也可以通过 NAT。
那么,这就是我的困境:除非我弄错了,否则 NAT 会将自己的地址和生成的端口号映射到它的客户端地址 端口 组合上。因此,为了成功穿越 NAT,我需要通过客户机上的一个端口移动所有数据包。更新线程只需监听一段时间,推出一个更新数据包,然后返回监听。
这就是它变得毛茸茸的地方。如果想要执行某些操作的原始线程想要端口,它必须唤醒在等待响应时阻塞的播音员。
我怎样才能在 Java 中做到这一点?
P.S.:如果事实证明 NAT 允许不同端口上的通信通过,那么事情就很棒了。
最佳答案
注意:我不一定要告诉您这是解决更大问题的正确方法。
但您的首要问题“我如何在 Java 中向 hibernate 线程发出信号”的答案是:调用 interrupt()
在线程上。您需要一个更精细的机制来传达为什么它被打断,但这只是一个开始。 interrupt()
将唤醒 sleep()
荷兰国际集团或wait()
带有 InterruptedException
的线程,但我认为这不是您真正要问的。
这将不会唤醒阻塞在 read()
调用上的线程,比如套接字。听起来您正在使用 DatagramSocket
,在这种情况下您有两种选择:
- 使用非阻塞实现。 (又名“基于选择器”,或 Java 术语中的新 I/O (nio))参见例如
DatagramChannel
;也可能this SO question和/或 this one - 使用普通的 Java I/O,set a socket timeout适当的长度,并将对
read()
的调用包装在一个循环中,检查适当的条件。
关于java - 如何在 Java 中向 hibernate 线程发出信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5131330/