java - 发送数据报包时,数据包的数据是重复的。 (java)

标签 java udp buffer packet datagram

UDP客户端:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    DatagramSocket socket;
    DatagramPacket packet;
    String str = "";
    byte[] buffer;
    String serverIP = "192.168.0.16";
    int serverPORT = 10789;
    Scanner sc = new Scanner(System.in);

    try {
        socket = new DatagramSocket();
        while(true) {
            System.out.print("To server : ");
            str = sc.nextLine();
            if(str.equals("exit")) {
                System.out.println("exit");
                break;
            }
            buffer = str.getBytes();
            packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName(serverIP), serverPORT);
            socket.send(packet);
            System.out.println("sent message : " + str);
        } 
        socket.close();
    } catch (skip)

UDP服务器:

byte[] buffer = new byte[1024];

public static void main(String[] args){
    int port = 10789;
    DatagramSocket socket;
    DatagramPacket packet;
    byte[] buffer = new byte[1024];

    try {
        socket = new DatagramSocket(port);
        packet = new DatagramPacket(buffer, buffer.length);
        while(true){
            socket.receive(packet);
            String text = new String(packet.getData());
            if(text.equals("exit")){
                System.out.println("exit");
                break;
            }
            System.out.println("received : "+text);
        }
    }

当我多次输入时,数据包的数据会重复。

示例:当我打字时:

输入abcdeg

在服务器上显示abcdeg

输入qwe

在服务器上显示qwedeg

出了什么问题?如何清理缓冲区?

最佳答案

在服务器代码中,所有接收到的数据包都会重用相同的缓冲区(这是一件好事)。然而,这意味着先前数据包中的数据一直存在于缓冲区中,直到被覆盖。正如您所看到的,当您收到比前一个数据包短的数据包时,只有缓冲区中的第一个字节被覆盖,直到接收到的消息的长度。

new String(packet.getData()) 让 String 构造函数通过查看缓冲区的内容来确定数据的长度。相反,使用 another constructor允许您指定数据的长度:new String(packet.getData(), 0, packet.getLength())

关于java - 发送数据报包时,数据包的数据是重复的。 (java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49716881/

相关文章:

linux - pyserial输入缓冲区

macos - Cocoa:如何创建 CFUrl/NSUrl 以从 ExtAudioFileOpenURL 的内存缓冲区中读取

java - Java中 "<object>"运算符的含义

c - 如何在 C 中使用 UDP 分配 PacketID 来跟踪不可靠网络上的数据包?

ssl - openssl DTLS 1.0.2k 是否接受碎片输入并重新组装碎片数据包?

Python TCP 线程

javascript - 如何将获取响应转换为数组缓冲区?

java - 一个 ListView 行中有多行文本?

父类(super class)的 Java 泛型上下文类型

java - 按属性对对象列表进行分组