簡體   English   中英

發送和接收UDP數據包?

[英]Sending and receiving UDP packets?

我制作了一個程序來從客戶端向服務器發送 UDP 數據包。

這是發射器代碼:

import java.io.IOException;
import java.net.*;

public class JavaApplication9 {    
    public static void main(String[] args) throws UnknownHostException, SocketException, IOException  {
        // TODO code application logic here
        byte[] buffer = {10,23,12,31,43,32,24};
        byte [] IP = {-64,-88,1,106};
        InetAddress address = InetAddress.getByAddress(IP);
        DatagramPacket packet = new DatagramPacket(
                buffer, buffer.length, address, 57
                );
        DatagramSocket datagramSocket = new DatagramSocket();
        datagramSocket.send(packet);
        System.out.println(InetAddress.getLocalHost().getHostAddress());
    }
}

接收器代碼功能是這樣的:

public void run() {
    try {
        DatagramSocket serverSocket = new DatagramSocket(port);
        byte[] receiveData = new byte[8];
        byte[] sendData = new byte[8];

        while (true) {
              DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
              serverSocket.receive(receivePacket);
              String sentence = new String( receivePacket.getData());
              System.out.println("RECEIVED: " + sentence);
              InetAddress IPAddress = receivePacket.getAddress();
              String sendString = "polo";
              sendData = sendString.getBytes();
              DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
              serverSocket.send(sendPacket);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我使用了 Wireshark 程序。 UDP 數據包在接收方的 Wireshark 程序中收到,但 Java 程序無法識別它,程序只是一直監聽端口而沒有任何反應?

接收方必須將接收方的端口設置為與發送方 DatagramPacket 中設置的端口相匹配。 對於調試,嘗試偵聽端口 > 1024(例如 5000 或 9000)。 端口 < 1024 通常由系統服務使用,並且需要管理員訪問權限才能綁定到這樣的端口。

如果接收器將數據包發送到它正在偵聽的硬編碼端口(例如端口 57)並且發送器在同一台機器上,那么您將創建一個到接收器本身的環回。 始終使用數據包中指定的端口,並且在生產軟件的情況下需要檢查以防止這種情況。

數據包無法到達目的地的另一個原因是發送方指定的 IP 地址錯誤。 UDP 與 TCP 不同,即使地址不可達,也會嘗試發送數據包,並且發送方不會收到錯誤指示。 您可以通過在接收器中打印地址來檢查這一點,作為調試的預防措施。

在您設置的發件人中:

 byte [] IP= { (byte)192, (byte)168, 1, 106 };
 InetAddress address = InetAddress.getByAddress(IP);

但使用字符串形式的地址可能更簡單:

 InetAddress address = InetAddress.getByName("192.168.1.106");

換句話說,您將目標設置為 192.168.1.106。 如果這不是接收者,那么您將無法獲得數據包。

這是一個簡單的 UDP 接收器,可以工作:

import java.io.IOException;
import java.net.*;

public class Receiver {

    public static void main(String[] args) {
        int port = args.length == 0 ? 57 : Integer.parseInt(args[0]);
        new Receiver().run(port);
    }

    public void run(int port) {    
      try {
        DatagramSocket serverSocket = new DatagramSocket(port);
        byte[] receiveData = new byte[8];
        String sendString = "polo";
        byte[] sendData = sendString.getBytes("UTF-8");

        System.out.printf("Listening on udp:%s:%d%n",
                InetAddress.getLocalHost().getHostAddress(), port);     
        DatagramPacket receivePacket = new DatagramPacket(receiveData,
                           receiveData.length);

        while(true)
        {
              serverSocket.receive(receivePacket);
              String sentence = new String( receivePacket.getData(), 0,
                                 receivePacket.getLength() );
              System.out.println("RECEIVED: " + sentence);
              // now send acknowledgement packet back to sender     
              DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length,
                   receivePacket.getAddress(), receivePacket.getPort());
              serverSocket.send(sendPacket);
        }
      } catch (IOException e) {
              System.out.println(e);
      }
      // should close serverSocket in finally block
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM