0

나는 채팅방 코드를 쓰고 있으며, 각 메시지는 클라이언트와 서버간에 끊임없이주고 받는다. 모든 메시지를 직렬화 된 객체로 만들고 정보를 앞뒤로 전달하는 데 사용하고 있습니다. 불행히도 이것은 객체가 처음 읽힐 때 던져지는 EOFException을 가져왔다.왜 ObjectInputStream이 EOFException을 던지고 있습니까?

Exception in thread "main" java.io.EOFException 
    at java.io.DataInputStream.readInt(Unknown Source) 
    at java.io.ObjectInputStream$BlockDataInputStream.readInt(Unknown Source) 
    at java.io.ObjectInputStream.readInt(Unknown Source) 
    at Serverside.ChatObject.readObject(ChatObject.java:36) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at java.io.ObjectStreamClass.invokeReadObject(Unknown Source) 
    at java.io.ObjectInputStream.readSerialData(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    at Clientside.Client.run(Client.java:161) 
    at Clientside.Client.main(Client.java:233) 

이는 ObjectOutputStream에 의해 발생합니다 폐쇄되고 있지 않을 경우 내가 잘 모르겠지만, 만약 그렇다면, 어떻게이 문제를 해결 않습니다 다음과 같이 오류 코드는 무엇입니까? 객체가 기록 될 때마다 스트림을 다시 열어야하고 입력 스트림이 데이터를 기다리기 위해 루프에 남아있을 수 있습니까?

이 내 사용자 지정 개체 읽기/쓰기 코드 : 스레드가 서버 측에서 시작되고 나면

private void writeObject(java.io.ObjectOutputStream stream) throws IOException{ 
    stream.writeObject(type); 
    stream.writeObject(chatroom); 
    stream.writeObject(target); 
    stream.writeObject(sender); 
    stream.writeObject(message); 
    stream.writeObject(users); 
    stream.close(); 
} 

private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException{ 
    type = stream.readInt(); 
    chatroom = stream.readInt(); 
    target = (String) stream.readObject(); 
    sender = (String) stream.readObject(); 
    message = (String) stream.readObject(); 
    users = (ArrayList<String>) stream.readObject(); 
    stream.close(); 
} 

그리고이 코드의 첫 번째 비트입니다. 다른 방법으로는 아직 호출 할 수 없었기 때문에이 문제는이 문제를 넘어서서는 발생하지 않았습니다. 누군가가이 켜지지 느낀다 경우 (객체 또는 클라이언트/쓰기 측에서) 필요에 따라

public void run(){ 
     try{ 
      out = new ObjectOutputStream(socket.getOutputStream()); 
      in = new ObjectInputStream(socket.getInputStream()); 

      while(true){ 
       out.writeObject(new ChatObject(0)); 
       out.flush(); 
       info = (ChatObject) in.readObject(); 
       name = info.getSender(); 
       if(name == null){ 
        return; 
       } 
       synchronized (names){ 
        if(!names.contains(name)){ 
         names.add(name); 
         break; 
        } 
       } 
      } 

, 나는 더 많은 코드를 포함 할 수 있습니다.

답변

0

stream.writeInt(type);

3

(link) DataInputStream#readInt에 대한 javadoc의 항목에서 빠른 보면,이 방법은 (파일 예외의 끝을 의미하는)을 EOFException를 throw 것을 가르쳐 때 에서 읽으려고 스트림과 int은 4 바이트보다 작습니다 (Java int4 바이트으로 이루어짐).

당신은 스트림까지 블록 충분한 데이터 : 당신이 type = stream.readInt();와 유형을 읽으면

+0

그래, 내가 이것에 대한 답을 찾고 있었다 작성해야이 들어 몇 가지 인터페이스를 사용해야합니다 전에 질문을하고이 문제에 대한 많은 게시물을 보았습니다. 방금 "in"에 대한 생성자에서 BufferedInputStream을 사용하여 문제를 보지 않았습니다. 그 다음에 bufferedOutputStream도 시도해 보았습니다. 그러면 프로그램이 정지되었습니다. – KM529

+0

He *는 '스트림에 충분한 데이터가 들어올 때까지 차단하는 인터페이스'를 사용합니다. 여기서 문제는 스트림에 충분한 데이터가 포함되지 않고 * 종료 된 것입니다. – EJP