2011-11-11 63 views
2

我的應用程序有一個主站和多個從站,它們響應主站的呼叫套接字並將對象中的統計信息發送出去。現在,我正在用一個主控器和兩個從器件測試代碼。代碼適用於1個奴隸,但有2個奴隸,主人收到的物品會被填充兩次,即同一物品的兩個副本。序列化期間的競爭條件

微波激射器的代碼:主從從站週期性地接收,並因此使用定時器exceuting:

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; 
} 
  1. 我想寫整個代碼,因此不希望使用的Jini或其他API。 謝謝!
+0

正在發送什麼對象?你如何保存它們? – Kane

+0

PM級的對象pm正在從機側發送。我使用一組PM對象將它們保存在主設備的一側。我有回答你的問題嗎? –

回答

3

當您收到

 //receiving the object pm of class PM 
    pm1=(PM)is.readObject(); 

不要只是將其存儲在一個字段作爲從第二從下一個對象也將被放置在該領域。

相反,您應該使用局部變量,讀取對象的內容並對其執行操作。或者,如果您希望另一個線程處理它,請將任務添加到單線程ExecutorService以處理對象。

+0

@ PeterLawrey-謝謝!試了一下。但是我將每個2秒鐘作爲定時任務運行主程序。而客戶端的對象並不總是包含相同的內容。 –