2014-07-18 7 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); 
     } 

서버 코드 :

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 루프에있는 서버에 설치 클라이언트 소켓을 통해 스트림을 전송하고 서버에서 받아와 동일한 소켓 연결에 수신으로이 이상한 행동을 혼란 스러워요 그리고 그것은 잘 동작하는 것 로컬 호스트에서.

도움 주셔서 감사합니다.

+0

모든 WorkerMessageToMaster에서 사용되는 모든 객체는 WorkerMessageToMaster와 마찬가지로 직렬화 가능합니까? ObjectStreams를 사용하여 보내려는 모든 객체는 직렬화 가능을 구현해야하며 그 중 모든 하위 객체가 구현되어야합니다. 기본 데이터 유형 (int, float 등)뿐만 아니라 문자열은 사용자가 아무것도 할 필요없이 직렬화 가능합니다. 그러나 자신의 클래스를 사용한다면 serializable을 구현해야한다. – Loki

+0

답변 해 주셔서 감사합니다. WorkerToMaster의 모든 객체는 직렬화 가능하다고 생각합니다. private ConcurrentHashMap mapStatus; \t 개인 ConcurrentHashMap reduceStatus; \t private 부울 mapFull; \t private 부울 reduceFull; 여기에 작업 세부 정보도 직렬화 가능합니다. – user3453339

답변

0

각 개체에 대해 새 스트림을 만듭니다. 하나의 출력과 하나의 입력 스트림 만 작성하십시오. 객체 스트림은 새 스트림을 만들 때 손상되었을 수있는 헤더 데이터를 보냅니다.

+0

도와 주셔서 감사합니다. 나는 그 문제를 발견했다. 동일한 소켓 스트림을 사용하는 PrintStream을 사용했습니다. 나는 이것이 문제를 해결했을 때 부패의 원인이되었다고 생각합니다. – user3453339