我的应用程序有一个主服务器和许多从服务器,它们响应主服务器的调用套接字并在对象中发送统计信息。现在,我正在用一个主服务器和两个从服务器测试代码。代码适用于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;
}
答案 0 :(得分:3)
收到
时 //receiving the object pm of class PM
pm1=(PM)is.readObject();
不要只将它存储在一个字段中,因为第二个从属的下一个对象也将被放置在那些字段中。
相反,您应该使用局部变量,读取对象的内容并对其进行操作。或者,如果您希望另一个线程处理它,请将任务添加到单个线程ExecutorService以处理对象。