[英]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.