반응형
원격 측 소켓을 감지하는 방법은 무엇입니까? [복제]
이 질문에 이미 답변이 있습니다.
Socket#close()
원격 측 소켓에서 호출 안내 어떻게 감지?
이 isConnected
메서드는 도움이되지 않으며 true
원격 측에서 소켓을 닫았더라도 반환 됩니다. 이 시도 :
public class MyServer {
public static final int PORT = 12345;
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket ss = ServerSocketFactory.getDefault().createServerSocket(PORT);
Socket s = ss.accept();
Thread.sleep(5000);
ss.close();
s.close();
}
}
public class MyClient {
public static void main(String[] args) throws IOException, InterruptedException {
Socket s = SocketFactory.getDefault().createSocket("localhost", MyServer.PORT);
System.out.println(" connected: " + s.isConnected());
Thread.sleep(10000);
System.out.println(" connected: " + s.isConnected());
}
}
서버를 시작하고 클라이언트를 시작하십시오. 소켓이 두 번째로 닫혀도 "connected : true"가 두 번 인쇄되는 것을 볼 수 있습니다.
실제로 알아내는 유일한 방법 IOException
은 관련 Input / OutputStreams에서 읽거나 (반환 값으로 -1을 얻음) 쓰는 것입니다 ( 파이프가 더러움).
답변이 다르기 때문에 나는 테스트하고 테스트 예제를 포함하여 결과를 게시하기로 결정했습니다.
여기에있는 서버는 클라이언트에 데이터를 쓰고 입력을 기대하지 않습니다.
서버 :
ServerSocket serverSocket = new ServerSocket(4444);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
while (true) {
out.println("output");
if (out.checkError()) System.out.println("ERROR writing data to socket !!!");
System.out.println(clientSocket.isConnected());
System.out.println(clientSocket.getInputStream().read());
// thread sleep ...
// break condition , close sockets and the like ...
}
- clientSocket.isConnected ()는 클라이언트가 연결되면 (그리고 연결이 계속되면) 이상하게 항상 true를 반환합니다 !!
- getInputStream (). 읽다 ()
- 클라이언트가 연결되어있는 한가 입력을 기다리게하는 프로그램이 아무 작업도하지 않게됩니다.
- 클라이언트 연결이 더러워지면 -1을 반환합니다.
- out.checkError ()는 클라이언트 연결이 실행됩니다.
클라이언트 소켓에 쓰는 동안 소켓 출력 스트림 오류를 확인할 수도 있습니다.
out.println(output);
if(out.checkError())
{
throw new Exception("Error transmitting data.");
}
Socket.Available 메소드는 원격 시스템이 연결을 종료하거나 닫는 경우 즉시 SocketException을 발생시킵니다.
참고 URL : https://stackoverflow.com/questions/151590/how-to-detect-a-remote-side-socket-close
반응형
'IT' 카테고리의 다른 글
PostgreSQL에서 데이터 항목이 자동으로 삭제되는 "만료"시간을 설정하는 방법이 있습니까? (0) | 2020.09.25 |
---|---|
node-gyp이란? (0) | 2020.09.25 |
boost :: function 및 boost :: bind 작동 방법 (0) | 2020.09.25 |
Android Studio는 물리적 장치를 Null로 인식하고 있습니까? (0) | 2020.09.17 |
C # .NET 3.5에서 진행률 표시 줄의 색상을 변경하는 방법은 무엇입니까? (0) | 2020.09.17 |