2013-04-30 4 views
0

클라이언트에서 서버로 int 값을 보내려고했습니다.Java로 InputStreamReader를 사용하는 중 오류가 발생했습니다.

_port = 8071; 
_socket = new Socket("localhost", _port); 

Random rand = new Random(); 
int n = rand.nextInt(50) + 1; 
DataOutputStream dos = new DataOutputStream(_socket.getOutputStream()); 
dos.writeInt(n); 
dos.flush(); 

서버 코드

try { 
    input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    ObjectInputStream in = null; 
    in = new ObjectInputStream(socket.getInputStream()); 
    int ClientNumber= in.readInt(); 
    System.out.println(ClientNumber); 
} 

하지만 잘못된 스트림 헤더 오류가 점점 오전 : 이것은 내가 아래 사용하고 클라이언트 코드입니다.

잘못된 스트림 헤더 :. java.io.ObjectInputStream.readStreamHeader (ObjectInputStream.java:781) java.io.ObjectInputStream의에서 (ObjectInputStream.java:278) ServiceRequest.run에서에서 0000002B (서비스 요청. java : 24) at java.util.concurrent.Executors $ RunnableAdapter.call (Executors.java:439) at java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:303) at java.util. concurrent.FutureTask.run (FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java:895) at java.util.concurrent.T java.lang.Thread.run (Thread.java:680)에서 hreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:918)

사람이 오류의 원인이 무엇인지 알고 있나요? 코드 설정이 잘못 되었습니까?

+0

왜 InputStreamReader를 만들고, BufferedReader에 래핑 한 다음 완전히 무시합니까? –

답변

1

당신은 ObjectInputStream를 사용하여 DataOutputStream읽기를 사용하여을 쓰고있어. 대신 DataInputStream를 사용한다 :

// Note declaration and assignment in a single statement. There's no point in 
// making it null first. 
DataInputStream in = new DataInputStream(socket.getInputStream()); 

// Note use of camelCase for variable name 
int clientNumber = in.readInt(); 

당신은 여기 input 제거한다 : 당신은 그것을 읽는하지 않는, 그것은 데이터의 스트림처럼이 보이는대로, 그것은 치료에 부적절 텍스트로.

아, finally 블록에서 입력 스트림을 닫아야합니다.

0

는 작동해야이

try { 
      // input = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      DataInputStream in = new DataInputStream(socket.getInputStream()); 
      int clientNumber= in.readInt(); 
      System.out.println(clientNumber); 
} 

같이 변경하려고합니다. ObjectInputStream은 ObjectOuputStream에 의해 전송 된 스트림 만 읽을 수 있습니다. 마법 번호 (머리글)가 0xACED으로 시작합니다. http://docs.oracle.com/javase/6/docs/platform/serialization/spec/protocol.html