作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
网络服务器在处理客户端连接时,有多种不同的处理模型。JDK1.4以前,Java只有阻塞I/O,最常用的一种处理模型就是:每接收一个连接,就需要新建一个线程去处理。其处理过程如下:
- 接收到一个新的Socket连接。
- 新建一个线程处理Socket。
- 读取请求数据。
- 进行业务处理。
- 写响应数据。
- 关闭Socket。
- 销毁线程。
这样的网络处理模型比较简单,容易实现。但每次接收到新的连接都要新建一个线程,处理完成后销毁线程,代价大。当有大量地短连接出现时,性能比较低。
代码示例
MultiThreadEchoServer源代码
|
|
Worker源代码
|
|
验证
1、启动服务。
执行上面的命令,启动服务,输出信息:
2013-10-22 19:38:51 cn.aofeng.demo.io.MultiThreadEchoServer main
信息: 多线程网络echo服务启动完毕,监听端口:9090
2、打开三个终端窗口,执行命令:
服务输出如下信息:
2013-10-22 19:38:56 cn.aofeng.demo.io.MultiThreadEchoServer main
信息: 收到一个新的连接,客户端IP:192.168.56.101,客户端Port:3390
2013-10-22 19:39:06 cn.aofeng.demo.io.MultiThreadEchoServer main
信息: 收到一个新的连接,客户端IP:192.168.56.101,客户端Port:3391
2013-10-22 19:39:11 cn.aofeng.demo.io.MultiThreadEchoServer main
信息: 收到一个新的连接,客户端IP:192.168.56.101,客户端Port:3392
注:服务所在机器的IP地址是192.168.56.102。
3、连接一段时间后,从终端输入exit或quit指令,服务端关闭连接,对应的线程也随之销毁,如下图所示:
可以看到创建了三个线程(Thread-2,Thread-3,Thread-4),当连接关闭后,线程也被销毁。