2014-07-18 31 views
0

我想創建一個客戶端服務器程序,我從客戶端發送一個對象並在服務器端不斷地在while循環中接收對象。錯誤接收ObjectInputStream

客戶端代碼:

ObjectOutputStream oos = null; 
while(true){ 

      WorkerMessageToMaster message = new WorkerMessageToMaster(WorkerTasksStatus.getTaskStatusMap(), WorkerTasksStatus.getTaskStatusReduce()); 
      oos = new ObjectOutputStream(taskManagerSocket.getOutputStream()); 
      oos.writeObject(message); 
      oos.flush(); 
      Thread.sleep(1000); 
     } 

Server代碼:

ObjectInputStream ois = null; 
while (true) { 

      ois = new ObjectInputStream(clientSocket.getInputStream()); 
      WorkerMessageToMaster taskMapObject = (WorkerMessageToMaster)ois.readObject(); 
      System.out.println("Connection from: "+clientSocket.getInetAddress().getHostAddress().toString()); 

     } 

當我嘗試運行我的本地系統上運行此代碼它運行正常,但是當我嘗試運行客戶機和服務器不同的機器(不同的Ips)我得到以下錯誤。

java.io.StreamCorruptedException: invalid stream header: 74000432 
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804) 
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) 
at master.MasterAnalyzer.heartBeat(MasterAnalyzer.java:58) 
at master.MasterAnalyzer.run(MasterAnalyzer.java:80) 
at java.lang.Thread.run(Thread.java:745) 

我很困惑,在作爲即時通訊發送通過與while循環服務器建立客戶端的socket流和接收它在服務器接受同一個套接字連接在這個不穩定的行爲,它似乎是工作的罰款在本地主機上。

感謝您的幫助

+0

是否在WorkerMessageToMaster可序列化以及WorkerMessageToMaster本身中使用了所有對象?你想用ObjectStreams發送的每個對象都必須實現可序列化,並且它的所有子節點都必須實現它。字符串以及原始數據類型(int,float等)都是可序列化的,無需您執行任何操作。但是如果你使用自己的類,他們必須實現可序列化。 – Loki

+0

謝謝你的回答。我相信WorkerToMaster中的所有對象都是可序列化的。 private ConcurrentHashMap mapStatus; \t private ConcurrentHashMap reduceStatus; \t私有布爾mapFull; \t private Boolean reduceFull; 這裏的任務細節也是可序列化的 – user3453339

回答

0

您爲每個對象創建一個新的流。只創建一個輸出和一個輸入流。對象流發送可能在創建新流時損壞的標題數據。

+0

感謝您的幫助。我發現了這個問題。我有使用相同套接字流的PrintStream。我認爲這是造成腐敗的原因,因爲當我將其刪除後,問題就解決了。 – user3453339