這是一個常見問題,但我似乎無法做到這一點,這不是由于防火墻,我確保Intellij已獲得授權。UDP 發送器:public static void main(String[] args){ Timer timer = new Timer(); try { InetAddress ip = InetAddress.getLocalHost(); int port = 9850; byte[] buffer = new byte[100]; DatagramPacket packet = new DatagramPacket(buffer, 100, ip, port); try { DatagramSocket socket = new DatagramSocket(port, ip); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("will send !"); try { socket.send(packet); }catch (IOException e){ e.printStackTrace(); return; } System.out.println("was sent !"); } },500, 500); } catch (SocketException e) { e.printStackTrace(); return; } }catch (UnknownHostException e){ e.printStackTrace(); return; }}UDP 接收器 public static void main(String[] args) { int port = 8888; byte[] buffer = new byte[100]; DatagramPacket packet = new DatagramPacket(buffer, 100); try { DatagramSocket socket = new DatagramSocket(port); while(true) { try { System.out.println("ready to receive"); socket.receive(packet); System.out.println("received a packet"); }catch (IOException e){ e.printStackTrace(); return; } } }catch(SocketException e){ e.printStackTrace(); return; }}發送數據包,發送方確實顯示“將發送/已發送”,但接收方未收到任何內容,它被阻止并且僅顯示“準備接收”ps:別介意套接字沒有關閉...
2 回答

狐的傳說
TA貢獻1804條經驗 獲得超3個贊
仔細查看您正在使用的各種調用,因為您正在濫用它們。DatagramSocket
DatagramPacket
在 Sender 程序中,您正在“構造一個數據報數據包,用于將長度的數據包發送到指定主機上的指定端口號”。然后,您將“創建一個綁定到指定本地地址的數據報套接字”。當您使用相同的端口 和 時,您實際上是將數據包發送到您列出的同一地址。length
InetAddr
在 Receiver 程序中,您“構造[]一個數據報套接字并將其綁定到本地主機上的指定端口。這一次,您將它綁定到與要將其發送到的端口不同的端口。(8888 vs 9850 您要將數據包發送到的位置)。
對于發送方,嘗試通過調用 來創建綁定到隨機端口的套接字。對于接收方,請更改套接字,使其綁定到發送方嘗試將其發送到的相同編號端口(例如 9850)DatagramSocket()

鴻蒙傳說
TA貢獻1865條經驗 獲得超7個贊
您不需要使用 while(true),因為 DatagramPacket.receive 方法將阻塞,直到收到數據報。
問題的原因可能是端口從一側到另一側不同
添加回答
舉報
0/150
提交
取消