【问题标题】:When creating an array of DatagramPackets, each element becomes the same as the most recent element added创建 DatagramPackets 数组时,每个元素都与最近添加的元素相同
【发布时间】:2025-11-30 14:20:04
【问题描述】:
public DatagramPacket[] makePackets(byte[] data, InetAddress IP, int portNumber)    {
   // create packet buffer
   ByteBuffer buffer = ByteBuffer.allocate(packetSize);

   // calculate number of packets
   int dataSize = packetSize - 10;
   int totalPackets = data.length / dataSize;
   if(data.length % dataSize > 0)
       totalPackets++;

   System.out.println("Total Packets " + totalPackets);

   DatagramPacket[] pkts = new DatagramPacket[totalPackets];

   for(int seqNumber = 0; seqNumber < totalPackets; seqNumber++)
   {
       // insert metadata
       buffer.putChar(informUpdate);
       buffer.putInt(seqNumber);
       buffer.putInt(totalPackets);

       // adds data to the buffer
       if(seqNumber == totalPackets -1) // if last packet adjust length to avoid null pointer
           buffer.put(data, seqNumber * dataSize, data.length - seqNumber*dataSize);
       else
           buffer.put(data, seqNumber * dataSize, dataSize);

       // create packet
       byte[] sendData = buffer.array();
       // add packets to packet array and clear buffer
       pkts[seqNumber] = new DatagramPacket(sendData, sendData.length, IP, portNumber);
       System.out.println(new String(pkts[seqNumber].getData())); // <- Check if packets are being made correctly
       buffer.clear();
   }
   // this shows prints all elements in pkts which proves all data is the same
   for(int i = 0; i < pkts.length; i++)
       System.out.println(new String(pkts[i].getData()));
   return pkts;    }

希望我以可读的格式添加了我的代码。提前谢谢!

【问题讨论】:

    标签: java arrays loops reference datagram


    【解决方案1】:

    当你这样做时:

    byte[] sendData = buffer.array();
    

    您在每次循环迭代中检索相同的字节数组。您创建的每个 DatagramPacket 都在重复使用相同的字节数组。

    最简单的解决方案是克隆字节数组,因为 Java 中的每个数组都有一个不会引发异常的公共 clone() 方法:

    byte[] sendData = buffer.array().clone();
    

    【讨论】:

    • 解决了!非常感谢!
    最近更新 更多