![Java核心技术·卷Ⅱ:高级特性(原书第10版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/937/34339937/b_34339937.jpg)
上QQ阅读APP看书,第一时间看更新
4.2.2 为多个客户端服务
前面例子中的简单服务器存在一个问题。假设我们希望有多个客户端同时连接到我们的服务器上。通常,服务器总是不间断地运行在服务器计算机上,来自整个因特网的用户希望同时使用服务器。前面的简单服务器会拒绝多客户端连接,使得某个用户可能会因长时间地连接服务而独占服务,其实我们可以运用线程的魔力把这个问题解决得更好。
每当程序建立一个新的套接字连接,也就是说当调用accept()时,将会启动一个新的线程来处理服务器和该客户端之间的连接,而主程序将立即返回并等待下一个连接。为了实现这种机制,服务器应该具有类似以下代码的循环操作:
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/201-i.jpg?sign=1739253872-Jf2CimcZY0iZjS0V85UQpMv2Ixboph58-0-2f1f2950fea6694c543d6e6ae3130803)
ThreadedEchoHandler类实现了Runnable接口,而且在它的run方法中包含了与客户端循环通信的代码。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/201-2-i.jpg?sign=1739253872-llfj0YiOQjs6Os4a9oILxT5QpWoJA4Yd-0-0dc1efa0b99e2241505899bab7d2a71b)
由于每一个连接都会启动一个新的线程,因而多个客户端就可以同时连接到服务器了。对此可以做个简单的测试:
1)编译和运行服务器程序(程序清单4-4)。
2)如图4-5打开数个telnet窗口。
3)在这些窗口之间切换,并键入命令。注意你可以同时通过这些窗口进行通信。
4)当完成之后,切换到你启动服务器程序的窗口,并使用CTRL+C强行关闭它。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/4a5-i.jpg?sign=1739253872-3gORm3PPjViRkm0J6XxDmbjYR0I7Of3e-0-071acadbaf7075c3e8a1b2012a6401b2)
图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=1739253872-w8SGNGHmx4kP44y85HoaxYtKLti5ZKPq-0-def23bbe1a44c019dcde4e9ffbdeea27)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/203-i.jpg?sign=1739253872-HTEj2USjOz8RQ0bDQ1VnJ0gl5nRRsLiJ-0-3d664ad0c39d3caea1c24f0fd90ef678)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/204-i.jpg?sign=1739253872-o1ISdkmLwLBuGDW2ekGARbW0pAef0oUG-0-8722e1ec74fbdec29d837366729c3efa)