>  기사  >  Java  >  다중 스레드 서버에서 차단 `ServerSocket.accept()` 루프를 정상적으로 종료하는 방법은 무엇입니까?

다중 스레드 서버에서 차단 `ServerSocket.accept()` 루프를 정상적으로 종료하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-25 17:44:43549검색

How to Gracefully Terminate a Blocking `ServerSocket.accept()` Loop in a Multithreaded Server?

차단 ServerSocket accept() 루프를 정상적으로 중단하는 방법

멀티 스레드 서버 애플리케이션에서 기본 스레드에는 일반적으로 accept()를 호출하는 루프가 있습니다. 들어오는 클라이언트 연결을 처리하기 위한 ServerSocket. 그러나 'exit'와 같은 종료 명령이 수신되면 차단 accept() 메서드를 중단하고 프로그램을 정상적으로 종료하기가 어려워집니다.

이 문제를 해결하려면 다음 접근 방식을 고려하세요.

다른 스레드의 close() 메서드 사용:

  1. 별도의 스레드(예: 관리 스레드)에서 소켓을 생성하고 이를 수신 대기 스레드에 연결합니다. 알려진 포트의 ServerSocket. 이렇게 하면 관리 스레드 자체에서 가짜 수신 연결이 생성됩니다.
  2. 관리 스레드가 'exit' 명령을 받으면 연결된 소켓에서 close()를 호출합니다.
  3. 메인 스레드에서 , ServerSocket이 닫히면 accept() 호출은 SocketException을 발생시켜 메인 스레드가 루프에서 벗어나 종료 프로세스를 진행할 수 있도록 합니다.

예제 코드:

메인 스레드:

<code class="java">while (listening) {
    try {
        Socket clientSocket = serverSocket.accept();
        // Start client thread and add it to collection
    } catch (SocketException e) {
        // Shutdown has been initiated, break out of loop
        listening = false;
    }
}</code>

관리 스레드:

<code class="java">// Create and connect to listening server socket
Socket adminSocket = new Socket("localhost", port);

// Wait for 'exit' command
...

// Close the admin socket to interrupt the main thread
adminSocket.close();</code>

이 접근 방식을 따르면 () 메서드는 ServerSocket이 다른 스레드에서 닫힐 때 발생하는 SocketException에 의해 중단될 수 있으며, 종료 명령에 대한 응답으로 프로그램이 정상적으로 종료될 수 있습니다.

위 내용은 다중 스레드 서버에서 차단 `ServerSocket.accept()` 루프를 정상적으로 종료하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.