클라이언트에서 객체를 보내고 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);
}
서버 코드 :
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 루프에있는 서버에 설치 클라이언트 소켓을 통해 스트림을 전송하고 서버에서 받아와 동일한 소켓 연결에 수신으로이 이상한 행동을 혼란 스러워요 그리고 그것은 잘 동작하는 것 로컬 호스트에서.
도움 주셔서 감사합니다.
모든 WorkerMessageToMaster에서 사용되는 모든 객체는 WorkerMessageToMaster와 마찬가지로 직렬화 가능합니까? ObjectStreams를 사용하여 보내려는 모든 객체는 직렬화 가능을 구현해야하며 그 중 모든 하위 객체가 구현되어야합니다. 기본 데이터 유형 (int, float 등)뿐만 아니라 문자열은 사용자가 아무것도 할 필요없이 직렬화 가능합니다. 그러나 자신의 클래스를 사용한다면 serializable을 구현해야한다. – Loki
답변 해 주셔서 감사합니다. WorkerToMaster의 모든 객체는 직렬화 가능하다고 생각합니다. private ConcurrentHashMap mapStatus; \t 개인 ConcurrentHashMap reduceStatus; \t private 부울 mapFull; \t private 부울 reduceFull; 여기에 작업 세부 정보도 직렬화 가능합니다. –
user3453339