3种下载文件程序的思考,为何使用NIO进行异步网络通讯
?服务端这么写代码会有什么问题?咱们先来看客户端代码,之后运行后就知道了。
?可以看到线程2的下载任务一直是0字节,等第一个线程下载完成后呢,线程2的下载任务才能进行。
??以上的Server就是在原始的socket基础上加了线程,每一个Client请求过来后,整个Server主线程不必处于阻塞状态,接收请求后直接另起一个新的线程来处理和客户端的交互,就是往客户端发送二进制包。这个在新线程中虽然阻塞,但是对于服务主线程没有阻塞的影响,主线程依然通过死循环监听着客户端的一举一动。另一个客户端的线程发起请求后就再起一个新的线程对象去为客户端服务。执行效果如下
??ServerSocketChannel相当于我们说的那个大粗管子,在它上面注册了很多这个管子感兴趣的事件,比如大便、小便、酒醉后吐的污浊都是它关心的。至于谁来控制管道应该关心的事件,是由管道通过Selector注册事件完成的,Selector相当于一个大管道的维护员了。管道必须得有服务商的厂家维护吧,不能滥用吧。Selector就是个管家,负责管道的事件监听的。XXXXBuffer相当于咱们说的坐便器,它是以块为单位进行管道疏通的,假如您的尺寸特别大,估计您排出的那个玩意也小不了,就配置一个大点的缓存传给服务那边,当然,您这边得到的服务端返回的加工后肥料,返给您的也是和您配置的尺寸有关系的。客户端的代码如下
?效果和上一个程序的效果差不多,只是时间上和内存资源占有率上有所提高,当然本机仅仅启动了几个线程,如果客户端启动更多线程,NIO的方式节约资源的效果是明显的,宕机概率小于阻塞IO方式很多。
![]()
![]()
![]()
不错正在看你的代码呢 呵呵
至于举例,通俗易懂很好,读不下去的朋友只能哪儿凉快哪儿呆着去了![]()
至于举例,通俗易懂很好,读不下去的朋友只能哪儿凉快哪儿呆着去了![]()
兄弟你言重了,没到那种高度。而且有些人适合比较严肃的风格,有些人适合比较风趣的风格。个人品味不太一样吧。![]()
![]()
![]()
![]()
小伙子很不错啊 40 楼 锅巴49 2011-10-09 好文,受教了. 41 楼 zrs217 2011-10-09 楼主说话很幽默,学习了! 42 楼 spring-china 2011-10-10 novoland 写道hi NIO 并非AIO,它是同步非阻塞IO,所以文章直接将NIO称呼为异步IO有点不妥
恩,对,nio是属于同步IO的. 而非异步IO,
这一句:
异步 I/O 调用不会阻塞。相反,您将注册对特定 I/O 事件的兴趣 — 可读的数据的到达、新的套接字连接,等等,而在发生这样的事件时,系统将会告诉您。
其实也是符合同步IO模型Reactor.
而异步IO模型,如Proactor,特征是支持异步的操作系统替事件处理器完成IO操作,事件处理器下达完IO命令后就不用管事了.
楼主的重口味比喻很生动形象,赞一个,呵呵

