Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java套接字接收信息时更改ArrayList_Java_Sockets_Arraylist_Datagram - Fatal编程技术网

从Java套接字接收信息时更改ArrayList

从Java套接字接收信息时更改ArrayList,java,sockets,arraylist,datagram,Java,Sockets,Arraylist,Datagram,我得到了这个错误,我只是无法想象的原因。我有一个接收包的receiver类,其中有一个ArrayList。不,数据包没有ArrayList;这个班有一个。当我收到一个新数据包时,ArrayList会被修改,但在我修改它之前。事实上,在我将数据包中的数据读入对象之前,我正在使用数据。不仅如此,ArrayList还在将数组中的所有对象更改为等效对象,该对象是在以后的指令中从数据创建的 产生奇怪行为的方法: public void processPackets() { byte[] buffe

我得到了这个错误,我只是无法想象的原因。我有一个接收包的receiver类,其中有一个ArrayList。不,数据包没有ArrayList;这个班有一个。当我收到一个新数据包时,ArrayList会被修改,但在我修改它之前。事实上,在我将数据包中的数据读入对象之前,我正在使用数据。不仅如此,ArrayList还在将数组中的所有对象更改为等效对象,该对象是在以后的指令中从数据创建的

产生奇怪行为的方法:

public void processPackets() {
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

    try {
        while(true) {
            System.out.println("Start:  " + outBuffer);

            socket.receive(packet);
            System.out.println("Before: " + outBuffer);

            // Find out where the packets are coming from
            if (sendHost == null) {
                sendHost = packet.getAddress();
                sendPort = packet.getPort();
            }

            // Grab the data from the packet
            PacketInfo data = new PacketInfo(packet.getData());
            System.out.println("Found: " + data);

            if (this.packetWithinWindow(data.getSequenceNumber())) {
                outBuffer.add(data);
                System.out.println("After:  " + outBuffer);
            }
            ackThePacket(data);

            if (processData()) {break;}; // Returns true after last packet processed

            System.out.println("End:  " + outBuffer);
        }

    } catch (IOException ioe) {
        System.err.println(ioe);
        System.exit(1);
    }

}
假定Exputfer是一个
ArrayList
PacketInfo.toString()
返回一个序列号和前20个字节的列表,这是一个奇怪行为的示例,然后打印到控制台(在Exputfer开始为空的代码中经过几个周期后):


这让我很困惑,所以非常感谢您的帮助。如果有什么帮助的话,这是用Java 6编译的。

您重复使用相同的字节数组,除非您的
PacketInfo
构造函数(您没有显示)复制数据。啊哈!应该是这样!我总是忘记正则数组也是引用类型,因为它们在很多方面都像原语一样处理。谢谢你!
Start:  []
Before: []
Found: 
2 [-120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120]
After:  [
2 [-120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120]]
End:  [
2 [-120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120]]
Start:  [
2 [-120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120, 8, 0, 2, -120]]
Before: [
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 76, 0, 71, 68, 70, 68, 48]]
Found: 
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 76, 0, 71, 68, 70, 68, 48]
After:  [
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 76, 0, 71, 68, 70, 68, 48], 
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 76, 0, 71, 68, 70, 68, 48]]
End:  [
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 76, 0, 71, 68, 70, 68, 48], 
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 76, 0, 71, 68, 70, 68, 48]]
Start:  [
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 76, 0, 71, 68, 70, 68, 48], 
1 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 65, 0, 76, 0, 71, 68, 70, 68, 48]]
Before: [
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
Found: 
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
After:  [
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
End:  [
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
4 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]