[英]java udp packet merging
在Java中使用UDP練習時遇到一個奇怪的問題。 如果我在服務器之間發送多個具有不同數據長度的UDP握手數據包,則UDP數據包將合並。 我正在使用計時器在服務器之間發送握手。
public class UDPtest {
public static UDPtest test = new UDPtest();
public static byte[] buffer = new byte[1024];
public static InetAddress host = null;
Timer timer = new Timer();
TimerTask ttimer = new TimerTask() {
public void run() {
//System.out.println("time");
}
};
public static void main(String args[]) throws Exception {
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receiveSocket = new DatagramSocket(Integer.parseInt(args[1]));
String s = "SEND "+args[0];
host = InetAddress.getByName("localhost");
buffer = s.getBytes();
DatagramPacket handshake = new DatagramPacket(buffer, buffer.length, host, Integer.parseInt(args[2]));
test.RouteTimer(receiveSocket,handshake);
while (true) {
DatagramPacket receivePacket = new DatagramPacket(buffer,buffer.length);
receiveSocket.receive(receivePacket);
String receiveString = new String(receivePacket.getData());
if (receiveString.substring(0,1).matches("A")) {
System.out.println(receiveString);
continue;
}
else {
System.out.println(receiveString);
String temp = "A "+args[0];
buffer = temp.getBytes();
DatagramPacket sendPacket = new DatagramPacket(buffer, buffer.length, host, Integer.parseInt(args[2]));
sendSocket.send(sendPacket);
}
}
}
public void RouteTimer(final DatagramSocket socket, final DatagramPacket handshake) {
Timer timer = new Timer();
TimerTask ttimer = new TimerTask() {
@Override
public void run() {
try {
socket.send(handshake);
}
catch (Exception e) {
}
}
};
timer.scheduleAtFixedRate(ttimer, 1000, 5000);
}
}
例如:如果我有服務器X和Y,則服務器X的預期輸出將是:
傳送X
斧頭
傳送X
斧頭
但輸出變為:
送Y
AY
森
AY
我試圖了解為什么會發生這種情況,以及如何解決該問題。 任何幫助,將不勝感激。
如果我在服務器之間發送多個具有不同數據長度的UDP握手數據包,則UDP數據包將合並。
不,他們沒有。
String receiveString = new String(receivePacket.getData());
您的問題在這里。 您正在忽略數據包的長度。 它應該是:
String receiveString = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.