有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

socketjava udp数据包合并

我在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的预期输出为:

SEND X

A X

SEND X

A X

但结果是:

SEND Y

A Y

SEN

A Y

我试图理解为什么会发生这种情况,以及如何解决问题。 任何帮助都将不胜感激


共 (1) 个答案

  1. # 1 楼答案

    If I send multiple UDP handshake packets of different data lengths between servers, the UDP packets merge.

    不,他们没有

    String receiveString = new String(receivePacket.getData());
    

    你的问题就在这里。您正在忽略数据包的长度。应该是:

    String receiveString = new String(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());