- Java核心技术·卷Ⅱ:高级特性(原书第10版)
- (美)凯S.霍斯特曼
- 550字
- 2024-12-20 22:36:09
4.2.2 为多个客户端服务
前面例子中的简单服务器存在一个问题。假设我们希望有多个客户端同时连接到我们的服务器上。通常,服务器总是不间断地运行在服务器计算机上,来自整个因特网的用户希望同时使用服务器。前面的简单服务器会拒绝多客户端连接,使得某个用户可能会因长时间地连接服务而独占服务,其实我们可以运用线程的魔力把这个问题解决得更好。
每当程序建立一个新的套接字连接,也就是说当调用accept()时,将会启动一个新的线程来处理服务器和该客户端之间的连接,而主程序将立即返回并等待下一个连接。为了实现这种机制,服务器应该具有类似以下代码的循环操作:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/201-i.jpg?sign=1739553010-VZrj0dbSQISvXqfpr9Vb4tipI0aN0y9c-0-56551def027eee630e43c8d9c92eddac)
ThreadedEchoHandler类实现了Runnable接口,而且在它的run方法中包含了与客户端循环通信的代码。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/201-2-i.jpg?sign=1739553010-4DC1jUNDoRneRIpVSBcmXEoZJ3Yartyn-0-7c7525cbd31f475c20796a060d09d593)
由于每一个连接都会启动一个新的线程,因而多个客户端就可以同时连接到服务器了。对此可以做个简单的测试:
1)编译和运行服务器程序(程序清单4-4)。
2)如图4-5打开数个telnet窗口。
3)在这些窗口之间切换,并键入命令。注意你可以同时通过这些窗口进行通信。
4)当完成之后,切换到你启动服务器程序的窗口,并使用CTRL+C强行关闭它。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/4a5-i.jpg?sign=1739553010-6pI11W3Vz2iP1jEBPGF8okaxMzQyIq0S-0-82f67c4b5e32a9369cb69c8059178b8b)
图4-5 多个同时通信的telnet窗口
注意:在这个程序中,我们为每个连接生成一个单独的线程。这种方法并不能满足高性能服务器的要求。为使服务器实现更高的吞吐量,你可以使用java.nio包中一些特性。详情请参见以下链接:http://www.ibm.com/developerworks/java/library/j-javaio。
程序清单4-4 threaded/ThreadedEchoServer.java
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/202-2-i.jpg?sign=1739553010-GW6g3Elz8Ucv2xBU4Utybfq4iJnshoQC-0-1ce9d56eca6655c3de67055bdf314e9c)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/203-i.jpg?sign=1739553010-e9m6Z1qJ7OJyZNb0w0ejxiwjibcVZZ8o-0-4a412f80ef8c1fdabbc2bfff69814353)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/204-i.jpg?sign=1739553010-HCUwx2zoinedtwJlM2V6ZWcjHMywemPn-0-d14e4ab5ca7d51eab0ac4d88d91b4182)