나는 채팅방 코드를 쓰고 있으며, 각 메시지는 클라이언트와 서버간에 끊임없이주고 받는다. 모든 메시지를 직렬화 된 객체로 만들고 정보를 앞뒤로 전달하는 데 사용하고 있습니다. 불행히도 이것은 객체가 처음 읽힐 때 던져지는 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;
}
}
}
, 나는 더 많은 코드를 포함 할 수 있습니다.
그래, 내가 이것에 대한 답을 찾고 있었다 작성해야이 들어 몇 가지 인터페이스를 사용해야합니다 전에 질문을하고이 문제에 대한 많은 게시물을 보았습니다. 방금 "in"에 대한 생성자에서 BufferedInputStream을 사용하여 문제를 보지 않았습니다. 그 다음에 bufferedOutputStream도 시도해 보았습니다. 그러면 프로그램이 정지되었습니다. – KM529
He *는 '스트림에 충분한 데이터가 들어올 때까지 차단하는 인터페이스'를 사용합니다. 여기서 문제는 스트림에 충분한 데이터가 포함되지 않고 * 종료 된 것입니다. – EJP