전체 추적을 매우 신중하게 검사해야합니다.
서버 소켓 응용 프로그램이 있고 java.net.SocketException: Connection reset
케이스를 수정했습니다 .
제 경우에는 Socket
어떤 이유로 인해 연결이 닫힌 clientSocket 객체 에서 읽는 동안 발생합니다 . (네트워크 손실, 방화벽 또는 애플리케이션 충돌 또는 의도 된 종료)
실제로이 Socket 객체에서 읽는 동안 오류가 발생하면 연결을 다시 설정했습니다.
Socket clientSocket = ServerSocket.accept();
is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
int readed = is.read(); // WHERE ERROR STARTS !!!
흥미로운 점은 for my JAVA Socket
경우에 클라이언트 커넥트 내 ServerSocket
닫고 아무것도 전송하지 않고 그 연결이 is.read()
자신을 호출 recursively.It 때문에 무한에 닫힌 연결에서 읽으려고이 소켓에서 읽는 동안 루프가되는 것 같다. 읽기 작업을 위해 아래와 같은 것을 사용하면;
while(true)
{
Receive();
}
그런 다음 아래와 같이 stackTrace를 얻습니다.
java.net.SocketException: Socket is closed
at java.net.ServerSocket.accept(ServerSocket.java:494)
내가 한 일은 ServerSocket을 닫고 연결을 갱신하고 추가 수신 클라이언트 연결을 기다리는 것입니다.
String Receive() throws Exception
{
try {
int readed = is.read();
....
}catch(Exception e)
{
tryReConnect();
logit(); //etc
}
//...
}
알 수없는 클라이언트 소켓 손실에 대한 연결이 다시 설정됩니다.
private void tryReConnect()
{
try
{
ServerSocket.close();
//empty my old lost connection and let it get by garbage col. immediately
clientSocket=null;
System.gc();
//Wait a new client Socket connection and address this to my local variable
clientSocket= ServerSocket.accept(); // Waiting for another Connection
System.out.println("Connection established...");
}catch (Exception e) {
String message="ReConnect not successful "+e.getMessage();
logit();//etc...
}
}
아래 이미지에서 볼 수 있듯이 try and catch
모든 것이 올바르게 보이기 때문에 연결이 끊어 졌는지 여부를 이해할 수 없기 때문에 다른 방법을 찾을 수 없습니다 . Connection reset
계속해서 찍는 동안이 스냅 샷을 얻었습니다 .