2017-12-04 7 views
-1

서버에 연결하고 해당 서버에서 버퍼 시퀀스를받는 Java 소켓이 있습니다. 서버가 연결을 닫을 때 전송이 중지됩니다 (즉, 옆에있는 수락 소켓을 닫음).Java 소켓이 닫혀있을 때 'connection reset'예외와 -1 반환 값의 차이

시간, 서버가 연결을 닫을 때, 클라이언트는 소켓과 관련된 InputStream의 읽기 방법에 -1 반환 코드를 가져옵니다 대부분 :

Socket sSocket = new Socket(ServerAddress ,acceptorPort); 
InputStream isr = sSocket.getInputStream(); 

byte[] buf    = new byte[3200]; 
int rr    = 1; 

while (rr != -1) { 
    try { 
     rr  = isr.read(buffer); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     break; 
    } 
} 

그러나 때로는 readjava.net.SocketException: Connection reset 제기 . 이 경우 , 나는 다음과 같은 스택 추적 한 :

java.net.SocketException: Connection reset 
at java.net.SocketInputStream.read(SocketInputStream.java:210) 
at java.net.SocketInputStream.read(SocketInputStream.java:141) 
at java.net.SocketInputStream.read(SocketInputStream.java:127) 
at com.testing.sockets.SimpleReadTest.main(SimpleReadTest.java:149) 

차이와 그 이유는 무엇입니까?

+0

위의 두 곳에서 -1을 가져야하는 곳이 1 개 있으며, 'IOException'을 잡아 당겨 루프를 제거해야합니다. – EJP

+0

맞습니다. 나는 변화를 만들었다. 하지만 왜 예외가 -1일까요? – FH35

+0

변경 사항을 모두 작성하지 않았습니다. 게시 된대로 현재 코드는 아무 것도하지 않습니다. 귀하의 질문에 전체 예외 및 스택 추적을 게시하십시오. – EJP

답변

-1

Javadoc있어서 차이점이있다 :

스트림의 끝에 도달 한 데이터가없는 경우
  • -1.
  • java.net.IOException - I/O 오류가 발생하는 경우.

java.net.SocketExceptionjava.io.IOException를 확장, 그래서 그것은 당신의 catch - 블록에 의해 체포된다.

+0

입력 스트림, 닫힌 소켓, 연결되지 않은 소켓 또는 'shutdownInput()'을 생성해도 '연결 재설정'이 발생하지 않습니다. 구현에 의존하지도 않습니다. – EJP

+0

답변을 다시 작성했습니다. –