![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=1738906980-RFPQ99L0yfWujwCY2gfV16qUkoApwnkR-0-15e50d160727ec2343e51290ca728fcf)
ThreadedEchoHandler类实现了Runnable接口,而且在它的run方法中包含了与客户端循环通信的代码。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/201-2-i.jpg?sign=1738906980-axlsCbnSASJ6VAf6QtX7nVBWWnXkD90R-0-234d589bfda77ca9c5c74073393e1bbb)
由于每一个连接都会启动一个新的线程,因而多个客户端就可以同时连接到服务器了。对此可以做个简单的测试:
1)编译和运行服务器程序(程序清单4-4)。
2)如图4-5打开数个telnet窗口。
3)在这些窗口之间切换,并键入命令。注意你可以同时通过这些窗口进行通信。
4)当完成之后,切换到你启动服务器程序的窗口,并使用CTRL+C强行关闭它。
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/4a5-i.jpg?sign=1738906980-N9Dm81nMYAJjNoqJAZuRK4IVpflmG0V0-0-3c2fd6d4c145c1e11f8e58061dd01fdf)
图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=1738906980-Pr5NoZEdL06BPjhFKyItOXDNndVrbtvI-0-f941f72a4b40b03efee66f2a3acb02df)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/203-i.jpg?sign=1738906980-H7jbDzoW2R5EkmfzJsimUfKRt7gpA1ih-0-86f7df9215039a3df50e4664dc33c03f)
![](https://epubservercos.yuewen.com/F21227/18365861501241106/epubprivate/OEBPS/Images/204-i.jpg?sign=1738906980-l9wodvT4ciJdTkYt35s1NTUZ4SrFd1YF-0-6e80f7c732384047c0032f554087b52f)