我的应用程序有一个主设备和许多从设备,它们响应主设备的调用套接字并在对象中发送统计信息。现在,我正在用一个主设备和两个从设备测试代码。代码在 1 个从属设备上工作正常,但在 2 个从属设备上工作正常,在主控端接收到的对象被填充两次,即同一对象的两个副本。
Maser 的代码:主设备定期从从设备接收数据,因此使用计时器执行:
public void run() {
try {
byte[] recvBuf = new byte[15000];
DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length);
DatagramSocket dSock = new DatagramSocket(4445);
dSock.receive(packet);
int byteCount = packet.getLength();
ByteArrayInputStream byteStream = new ByteArrayInputStream(recvBuf);
ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream));
//receiving the object pm of class PM
pm1=(PM)is.readObject();
}
}
和奴隶的代码:
{
InetAddress address = InetAddress.getByName("10.129.54.254");
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(15000);
os = new ObjectOutputStream(new BufferedOutputStream(byteStream));
os.flush();
//sending the object pm of class PM
os.writeObject((PM)pm);
os.flush();
byte[] sendBuf = byteStream.toByteArray();
DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, address, 4445);
int byteCount = packet.getLength();
DatagramSocket dSock = new DatagramSocket();
dSock.send(packet);
os.close();
dSock.close();
}
}
疑问: 1. 我应该将两个从站的对象存储在一个数组中吗?如果是这样,如何区分通过套接字接收的两个对象,以便同一个对象不会存储两次?假设发送过来的对象有一个唯一的属性,比如id。 即
class PM{
int uniqueid;
}
- 我正在尝试编写整个代码,因此不想使用 Jini 或其他 API。 谢谢!
最佳答案
当您收到
//receiving the object pm of class PM
pm1=(PM)is.readObject();
不要只是将其存储在字段中,因为来自第二个从属的下一个对象也将放置在该字段中。
相反,您应该使用局部变量,读取对象的内容并对其进行操作。或者,如果您希望另一个线程来处理它,请将任务添加到单线程 ExecutorService 来处理对象。
关于java - 序列化期间的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8098072/