兩個線程:一個循環 socket.receive(packet) 阻塞接收,收到後啟動發送線程,發送時卡在 packet.getSocketAddress()。疑問:Socket 處於阻塞狀態時能否發送?
Java/UDP 的 DatagramSocket 默認阻塞模式下,同一 Socket 不支持並發收發。 接收線程持續佔用 Socket 進行阻塞式 receive(),導致發送線程調用 send() 時同步等待,甚至死鎖。
DatagramSocket 綁定同一本地端口(需 setReuseAddress(true))。receive(),一個專職 send(),互不干擾。DatagramChannel 配置 configureBlocking(false)。SelectionKey.OP_READ | OP_WRITE 到 Selector。socket.setSoTimeout(100) 非無限阻塞。receive() 捕獲超時異常,再檢查發送隊列 send()。DatagramSocket recvSocket = new DatagramSocket(null);
recvSocket.setReuseAddress(true);
recvSocket.bind(new InetSocketAddress(localPort));
DatagramSocket sendSocket = new DatagramSocket(null);
sendSocket.setReuseAddress(true);
sendSocket.bind(new InetSocketAddress(localPort)); // 同端口
// 此後 recvSocket 只收,sendSocket 只發
UDP Socket 阻塞模式下單 Socket 不宜雙線程收發。**雙 Socket 綁定同端口**是最簡單有效的工程方案;高性能場景請上 NIO (DatagramChannel + Selector)。