Heim > Java > javaLernprogramm > Wie kann man eine blockierende „ServerSocket.accept()'-Schleife in einem Multithread-Server ordnungsgemäß beenden?

Wie kann man eine blockierende „ServerSocket.accept()'-Schleife in einem Multithread-Server ordnungsgemäß beenden?

Susan Sarandon
Freigeben: 2024-10-25 17:44:43
Original
667 Leute haben es durchsucht

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

So brechen Sie elegant aus der blockierenden ServerSocket-accept()-Schleife aus

In einer Multithread-Serveranwendung verfügt der Hauptthread normalerweise über eine Schleife, die Accept() aufruft ein ServerSocket zur Verarbeitung eingehender Clientverbindungen. Wenn jedoch ein Befehl zum Herunterfahren empfangen wird, z. B. „exit“, wird es schwierig, die blockierende Methode „accept()“ zu unterbrechen und das Programm ordnungsgemäß zu beenden.

Um dieses Problem zu beheben, ziehen Sie den folgenden Ansatz in Betracht:

Verwenden Sie die Methode close() aus einem anderen Thread:

  1. Erstellen Sie in einem separaten Thread (z. B. dem Admin-Thread) einen Socket und verbinden Sie ihn mit dem Abhören ServerSocket an einem bekannten Port. Dadurch wird eine gefälschte eingehende Verbindung vom Admin-Thread selbst erstellt.
  2. Wenn der Admin-Thread den Befehl „exit“ erhält, ruft er close() auf seinem verbundenen Socket auf.
  3. Im Haupt-Thread , löst der Aufruf „accept()“ eine SocketException aus, sobald der ServerSocket geschlossen ist, wodurch der Hauptthread aus der Schleife ausbrechen und mit dem Herunterfahren fortfahren kann.

Beispielcode:

Hauptthread:

<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>
Nach dem Login kopieren

Admin-Thread:

<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>
Nach dem Login kopieren

Wenn Sie diesem Ansatz folgen, akzeptieren Sie ()-Methode kann durch eine SocketException unterbrochen werden, die ausgelöst wird, wenn der ServerSocket von einem anderen Thread geschlossen wird, wodurch das Programm als Reaktion auf Befehle zum Herunterfahren ordnungsgemäß beendet werden kann.

Das obige ist der detaillierte Inhalt vonWie kann man eine blockierende „ServerSocket.accept()'-Schleife in einem Multithread-Server ordnungsgemäß beenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage