Rumah  >  Artikel  >  Java  >  Bagaimana untuk Menamatkan Gelung `ServerSocket.accept()` Sekatan dalam Pelayan Berbilang Thread?

Bagaimana untuk Menamatkan Gelung `ServerSocket.accept()` Sekatan dalam Pelayan Berbilang Thread?

Susan Sarandon
Susan Sarandonasal
2024-10-25 17:44:43549semak imbas

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

Cara Memecahkan Gelung ServerSocket yang Menyekat accept() dengan Anggun

Dalam aplikasi pelayan berbilang benang, utas utama biasanya mempunyai gelung yang memanggil accept() pada ServerSocket untuk mengendalikan sambungan pelanggan masuk. Walau bagaimanapun, jika arahan penutupan diterima, seperti 'keluar,' ia menjadi mencabar untuk mengganggu kaedah menyekat accept() dan keluar dari program dengan anggun.

Untuk menangani isu ini, pertimbangkan pendekatan berikut:

Gunakan kaedah close() daripada Benang Lain:

  1. Dalam urutan berasingan (cth., utas Pentadbir), cipta Soket dan sambungkannya kepada pendengaran ServerSocket pada port yang diketahui. Ini akan mewujudkan sambungan masuk palsu daripada utas Pentadbir itu sendiri.
  2. Apabila utas Pentadbiran menerima arahan 'keluar', ia memanggil close() pada Soket yang disambungkan.
  3. Dalam utas utama , panggilan accept() akan membuang SocketException sebaik sahaja ServerSocket ditutup, membenarkan utas utama keluar daripada gelung dan meneruskan proses penutupan.

Kod Contoh:

Urut Utama:

<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>

Urut Admin:

<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>

Dengan mengikuti pendekatan ini, terima () kaedah boleh diganggu oleh SocketException yang dilemparkan apabila ServerSocket ditutup daripada urutan lain, membolehkan atur cara keluar dengan anggun sebagai tindak balas kepada arahan penutupan.

Atas ialah kandungan terperinci Bagaimana untuk Menamatkan Gelung `ServerSocket.accept()` Sekatan dalam Pelayan Berbilang Thread?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn