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