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