IT

원격 측 소켓을 감지하는 방법은 무엇입니까?

lottoking 2020. 9. 25. 08:16
반응형

원격 측 소켓을 감지하는 방법은 무엇입니까? [복제]


이 질문에 이미 답변이 있습니다.

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

반응형