官术网_书友最值得收藏!

4.2.2 為多個客戶端服務

前面例子中的簡單服務器存在一個問題。假設我們希望有多個客戶端同時連接到我們的服務器上。通常,服務器總是不間斷地運行在服務器計算機上,來自整個因特網的用戶希望同時使用服務器。前面的簡單服務器會拒絕多客戶端連接,使得某個用戶可能會因長時間地連接服務而獨占服務,其實我們可以運用線程的魔力把這個問題解決得更好。

每當程序建立一個新的套接字連接,也就是說當調用accept()時,將會啟動一個新的線程來處理服務器和該客戶端之間的連接,而主程序將立即返回并等待下一個連接。為了實現這種機制,服務器應該具有類似以下代碼的循環操作:

ThreadedEchoHandler類實現了Runnable接口,而且在它的run方法中包含了與客戶端循環通信的代碼。

由于每一個連接都會啟動一個新的線程,因而多個客戶端就可以同時連接到服務器了。對此可以做個簡單的測試:

1)編譯和運行服務器程序(程序清單4-4)。

2)如圖4-5打開數個telnet窗口。

3)在這些窗口之間切換,并鍵入命令。注意你可以同時通過這些窗口進行通信。

4)當完成之后,切換到你啟動服務器程序的窗口,并使用CTRL+C強行關閉它。

圖4-5 多個同時通信的telnet窗口

注意:在這個程序中,我們為每個連接生成一個單獨的線程。這種方法并不能滿足高性能服務器的要求。為使服務器實現更高的吞吐量,你可以使用java.nio包中一些特性。詳情請參見以下鏈接:http://www.ibm.com/developerworks/java/library/j-javaio

程序清單4-4 threaded/ThreadedEchoServer.java

主站蜘蛛池模板: 桂东县| 太仆寺旗| 靖宇县| 茶陵县| 土默特右旗| 开阳县| 阿荣旗| 金寨县| 益阳市| 宜都市| 富源县| 开江县| 六枝特区| 威宁| 顺平县| 北票市| 揭东县| 永州市| 临颍县| 武宁县| 土默特右旗| 朝阳区| 舞钢市| 三明市| 白河县| 安陆市| 开原市| 镇江市| 望江县| 淳化县| 偃师市| 南岸区| 五峰| 黄冈市| 天全县| 循化| 和龙市| 抚宁县| 固始县| 临桂县| 荣昌县|