Java多線程服務器如何應對相關鏈接問題
Java多線程服務器是目前很多企業都在使用的一種服務器方式。相關的問題還是需要不斷的學習,只有不斷的學習才能更好的掌握相關的問題解決方案。希望大家有所收獲。
前面的示例教給您基礎知識,但并不能令您更深入。如果您到此就停止了,那么您一次只能處理一臺客戶機。原因是 handleConnection() 是一個阻塞方法。只有當它完成了對當前連接的處理時,服務器才能接受另一個客戶機。在多數時候,您將需要(也有必要)一個Java多線程服務器。
要開始同時處理多臺客戶機,并不需要對 RemoteFileServer 作太多改變。事實上,要是我們前面討論過待發(backlog),那我們就只需改變一個方法,雖然我們將需要創建一些新東西來處理進入的連接。這里我們還將向您展示Java多線程服務器 ServerSocket 如何處理眾多等待(備份)使用服務器的客戶機。本示例對線程的低效使用,所以請耐心點。
接受(太多)連接
這里我們實現改動過的 acceptConnections() 方法,它將創建一個能夠處理待發請求的 ServerSocket ,并告訴 ServerSocket 接受連接:
Java代碼
- public void acceptConnections() {
- try {
- ServerSocket server = new ServerSocket(listenPort, 5);
- Socket incomingConnection = null;
- while (true) {
- incomingConnection = server.accept();
- handleConnection(incomingConnection);
- }
- } catch (BindException e) {
- System.out.println("Unable to bind to port " + listenPort);
- } catch (IOException e) {
- System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
- }
- }
- public void acceptConnections() {
- try {
- ServerSocket server = new ServerSocket(listenPort, 5);
- Socket incomingConnection = null;
- while (true) {
- incomingConnection = server.accept();
- handleConnection(incomingConnection);
- }
- } catch (BindException e) {
- System.out.println("Unable to bind to port " + listenPort);
- } catch (IOException e) {
- System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
- }
- }
新的 server 仍然需要 acceptConnections() ,所以這些代碼實際上是一樣的。突出顯示的行表示一個重大的不同。對這個多線程版,我們現在可以指定客戶機請求的最大數目,這些請求都能在實例化 ServerSocket 期間處于待發狀態。如果我們沒有指定客戶機請求的最大數目,則我們假設使用缺省值 50。
這里是它的工作機制。假設我們指定待發數(backlog 值)是 5 并且有五臺客戶機請求連接到我們的服務器。我們的服務器將著手處理第一個連接,但處理該連接需要很長時間。由于我們的待發值是 5,所以我們一次可以放五個請求到隊列中。我們正在處理一個,所以這意味著還有其它五個正在等待。等待的和正在處理的一共有六個。當我們的服務器仍忙于接受一號連接(記住隊列中還有 2―6 號)時,如果有第七個客戶機提出連接申請,那么,在Java多線程服務器中該第七個客戶機將遭到拒絕。我們將在帶有連接池服務器示例中說明如何限定能同時連接的客戶機數目。
【編輯推薦】