2013-09-23 2 views
0

내가이 question에서 언급했듯이, 나는 SocketException : Connection reset을 얻고 있었다.
Aaron의 대답을 구현 한 후 의도 한대로 작동하는 것으로 보입니다. 하지만 오늘 코드를 다시 실행하면 연결 재설정 오류가 다시 발생합니다.
문제는 ... 내가 5 배처럼 내 코드를 실행하는 경우, 2/5 시간을 작동하는 것 같다 나머지는 나에게 오류를 제공한다는 것입니다무작위 SocketException : 연결 재설정

서버 :

import java.io.*; 
import java.net.*; 

public class Server { 

    public static void main(String[] args) throws IOException, ClassNotFoundException {  
      ServerSocket server = new ServerSocket(444); 
      while (true) { 
       Socket socket = server.accept(); 
       ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream()); 
       Object objRead = objIn.readObject(); 
       if (objRead != null) { 
        System.out.println(objRead); 
       } 
      }  
    } 
} 

클라이언트 :

import java.io.*; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.util.HashMap; 

public class Client { 

    public static void main(String[] args) throws IOException { 
     Socket sock; 
     int port = 444; 
     HashMap<Integer, String> mapSend= new HashMap<>(); 
     mapSend.put(1,"row1"); 
     mapSend.put(2,"row2"); 

     sock = new Socket(InetAddress.getLocalHost(), port); 
     ObjectOutputStream objOut = new ObjectOutputStream(sock.getOutputStream()); 

     objOut.writeObject(mapSend); 
     objOut.flush(); 
    } 
} 

이 오류입니다 :

java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:189) 
    at java.net.SocketInputStream.read(SocketInputStream.java:121) 
    at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2308) 
    at java.io.ObjectInputStream$BlockDataInputStream.read(ObjectInputStream.java:2716) 
    at java.io.ObjectInputStream$BlockDataInputStream.readFully(ObjectInputStream.java:2740) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1978) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1913) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    at java.util.HashMap.readObject(HashMap.java:1154) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
    at iotest.Server.main(Server.java:16) 
: (이 서버의 출력에 나타납니다 나는 클라이언트를 실행 한 후)

클라이언트 측에서 오류가 발생하지 않습니다.

수정
클라이언트 - 서버를 디버깅 할 수있는 방법은 없나요? 그게 당신에게 더 많은 정보를 줄 수 있도록 도와 줄 수 있습니다.

답변

1

그냥 플러시하는 대신 출력 스트림을 닫습니다.

NB readObject()는 null을 쓰지 않는 한 null을 반환하지 않습니다. 테스트는 무의미합니다.

+0

ObjectOutputStream을 닫으면 flush() 후에 문제가 해결됩니다. 고맙습니다. – akafortes

+0

@akafortes 닫기로 설정하면 완전히 플러시 할 필요가 없습니다. – EJP