2014-05-19 6 views
0

클라이언트 :소켓을 올바르게 닫는 방법?

열기 소켓 :

Socket socket = new Socket(host,port); 

데이터 쓰기 :

socket.getOutputStream().write("str"); 
socket.getOutputStream().flush(); 

데이터 읽기 :

response = socket.getInputStream().read(); 

닫기 연결 및 소켓 :

socket.shutdownInput(); 
socket.shutdownOutput(); 
socket.close(); 

는 서버 :

Socket clientSocket = serverSocket.accept(); 
message = clientSocket.getInputStream().read(); 
clientSocket.getOutputStream().write("str2"); 

clientSocket.isConnected()가 true를 반환하고, 서버는 클라이언트가 연결되어 있음을 볼 수 없습니다. 클라이언트의 연결이 끊어 졌음을 감지하는 방법은 무엇입니까?

가 난 이것을 사용하려고 :

try { 
    while (true) { 
      message = clientSocket.getInputStream().read(); 
      clientSocket.getOutputStream().write("str2"); 
    } 
} catch (IOException e) { 
    clientSocket.close(); 
} 

을하지만 그것은 작동하지 않습니다.

+0

[관련] (http://stackoverflow.com/questions/155243/why-is-it-impossible-without-attempting-io-to-detect-that-tcp-socket-was-grac?lq = 1) [질문] (또는 http://stackoverflow.com/questions/151590/java-how-to-detect-a-remote-side-socket-close) 그 소켓을 감지하는 방법을 논의했다 (또는 실제로 왜 신뢰성있게 검출 할 수는 없다). –

답변

0

일반적인 접근 방식은 클라이언트가 서버에 "종료"메시지를 보내는 것입니다. 그러면 서버가 소켓을 닫습니다.

다른 접근법은 서버 소켓에서 I/O를 수행하고 클라이언트가 사라졌을 때 얻을 수있는 예외를 잡는 것입니다.

후자의 접근 방식은 몇 가지 단점이 있습니다 : 그것은 클라이언트에 도달하려고 포기 서버의 시간이 좀 걸릴 것

  • 오류 메시지가 없습니다 수도 (즉, 2 분 정도 걸릴 수 있습니다) 항상 같아야합니다. 일반적으로 OS의 오류 메시지와 함께 SocketException이 표시됩니다.
관련 문제