【Java TCP/IP Socket】Java NIO Socket VS 标准IO Socket

来源:互联网 发布:淘宝客服不是人做的 编辑:程序博客网 时间:2024/04/20 23:22

 转载请注明出处:http://blog.csdn.net/ns_code/article/details/15378417


  简介

    Java  NIO从JDK1.4引入,它提供了与标准IO完全不同的工作方式。

NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题。
    1、 Buffer:它是包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的I/O操作。
    2、 Charset:它提供Unicode字符串影射到字节序列以及逆影射的操作。
    3、 Channels:包含socket,file和pipe三种管道,它实际上是双向交流的通道。
    4、 Selector:它将多元异步I/O操作集中到一个或多个线程中。

   比较

   1、数据的读写操作

    标准的IO是基于字节流和字符流进行操作的,它不能前后移动流中的数据,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作的,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中,需要时可以在缓冲区中前后移动所保存的数据。

   2、非阻塞

   在标准IO的Socket编程中,套接字的某些操作可能会造成阻塞:accept()方法的调用可能会因为等待一个客户端连接而阻塞,read()方法也可能会因为没有数据可读而阻塞,write()方法在数据没有完全写入时也可能会发生阻塞,阻塞发生时,该线程被挂起,什么也干不了。

   阻塞式网络 IO 的特点:

    1)多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。

    2)每个线程遇在外部未准备好的时候,都会阻塞。阻塞的结果就是会带来大量的上下文切换。且大部分上下文切换可能是无意义的。比如假设一个线程监听一个端口,一天只会有几次请求进来,但是该 cpu 不得不为该线程不断做上下文切换尝试,大部分的切换以阻塞告终。

    NIO则具有非阻塞的特性,可以通过对channel的阻塞行为的配置,实现非阻塞式的信道。在非阻塞情况下,线程在等待连接,写数据等(标准IO中的阻塞操作)的同时,也可以做其他事情,这便实现了线程的异步操作。

   非阻塞式网络IO的特点:

    1)把整个过程切换成小的任务,通过任务间协作完成。

    2)由一个专门的线程来处理所有的 IO 事件,并负责分发。

    3)事件驱动机制:事件到的时候触发,而不是同步的去监视事件。

    4)线程通讯:线程之间通过 wait,notify 等方式通讯。保证每次上下文切换都是有意义的。减少无谓的进程切换。

    3、选择器

   Java NIO引入了选择器的概念,选择器可以监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道,这也是非阻塞IO的核心。而在标准IO的Socket编程中,单个线程则只能在一个端口监听。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 银行取100万现金怎么办 给老外发警告信后怎么办 照片上传是歪的怎么办 日亚不能直邮的怎么办 电话信息被卖了怎么办 被亚马逊跟卖了怎么办 玉米出芽后土壤不够湿怎么办 雨伞请输入授权码怎么办 网页放手机端后看不了怎么办 微信收款码存在违法行为怎么办 tst优惠码密码忘了怎么办 扩展器登录不上怎么办 微信学法小程序积分不更新怎么办 开发商不给办房产证怎么办 传淘宝产品规格不匹配怎么办 刚买的手机想退怎么办 空调主机空间不足不散热怎么办 lol网速快延迟高怎么办 4g手机延迟高怎么办 天气冷鼻炎就犯怎么办 天气冷宝宝发烧了怎么办 wp手机开机忘记了密码怎么办 微商退货不退款怎么办 微商退货了不退款怎么办 微商退货后不退款怎么办 有赞买东西付款没发货怎么办 赞礼号掉了东西怎么办 万达贷系统维护还不了款怎么办 qq文件发不出去怎么办 1688分销没有传淘宝怎么办 京东的货运代理怎么办 天天练推广期没了怎么办 微信自动建群怎么办 刚刚不小心扫了无痕爆客怎么办 苹果6升级卡死怎么办 随行付换手机了怎么办 融e联账号冻结怎么办 58同城高危账户怎么办 网购迟迟不发货怎么办 优酷不能投屏了怎么办 爱尚街借款不还怎么办