我想創建一個客戶端服務器程序,我從客戶端發送一個對象並在服務器端不斷地在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流和接收它在服務器接受同一個套接字連接在這個不穩定的行爲,它似乎是工作的罰款在本地主機上。
感謝您的幫助
是否在WorkerMessageToMaster可序列化以及WorkerMessageToMaster本身中使用了所有對象?你想用ObjectStreams發送的每個對象都必須實現可序列化,並且它的所有子節點都必須實現它。字符串以及原始數據類型(int,float等)都是可序列化的,無需您執行任何操作。但是如果你使用自己的類,他們必須實現可序列化。 – Loki
謝謝你的回答。我相信WorkerToMaster中的所有對象都是可序列化的。 private ConcurrentHashMap mapStatus; \t private ConcurrentHashMap reduceStatus; \t私有布爾mapFull; \t private Boolean reduceFull; 這裏的任務細節也是可序列化的 –
user3453339