`

底层网络读写

阅读更多

Java NIO:NIO概述

      http://www.cnblogs.com/dolphin0520/p/3919162.html

  在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题。NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题。本文下面分别从Java NIO的几个基础概念介绍起。

  以下是本文的目录大纲:

  一.NIO中的几个基础概念

  二.Channel

  三.Buffer

  四.Selector

  若有不正之处,请多多谅解并欢迎批评指正。

  请尊重作者劳动成果,转载请标明原文链接:

   http://www.cnblogs.com/dolphin0520/p/3919162.html

一.NIO中的几个基础概念

  在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。

  首先从Channel说起吧,通道,顾名思义,就是通向什么的道路,为某个提供了渠道。在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的:

1
2
3
4
5
6
7
8
9
public class Test {
    public static void main(String[] args) throws IOException  {
        File file = new File("data.txt");
        InputStream inputStream = new FileInputStream(file);
        byte[] bytes = new byte[1024];
        inputStream.read(bytes);
        inputStream.close();
    }  
}

   这里的InputStream实际上就是为读取文件提供一个通道的。

  因此可以将NIO 中的Channel同传统IO中的Stream来类比,但是要注意,传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。而Channel是双向的,既可用来进行读操作,又可用来进行写操作。

  Buffer(缓冲区),是NIO中非常重要的一个东西,在NIO中所有数据的读和写都离不开Buffer。比如上面的一段代码中,读取的数据时放在byte数组当中,而在NIO中,读取的数据只能放在Buffer中。同样地,写入数据也是先写入到Buffer中。

  下面介绍一下NIO中最核心的一个东西:Selector。可以说它是NIO中最关键的一个部分,Selector的作用就是用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件然后进行处理。

  比如看下面的这个例子:

   

  用单线程处理一个Selector,然后通过Selector.select()方法来获取到达事件,在获取了到达事件之后,就可以逐个地对这些事件进行响应处理。

二.Channel

  在前面已经提到,Channel和传统IO中的Stream很相似。虽然很相似,但是有很大的区别,主要区别为:通道是双向的,通过一个Channel既可以进行读,也可以进行写;而Stream只能进行单向操作,通过一个Stream只能进行读或者写;

  以下是常用的几种通道:

  • FileChannel
  • SocketChanel
  • ServerSocketChannel
  • DatagramChannel

  通过使用FileChannel可以从文件读或者向文件写入数据;通过SocketChannel,以TCP来向网络连接的两端读写数据;通过ServerSocketChanel能够监听客户端发起的TCP连接,并为每个TCP连接创建一个新的SocketChannel来进行数据读写;通过DatagramChannel,以UDP协议来向网络连接的两端读写数据。

  下面给出通过FileChannel来向文件中写入数据的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {
    public static void main(String[] args) throws IOException  {
        File file = new File("data.txt");
        FileOutputStream outputStream = new FileOutputStream(file);
        FileChannel channel = outputStream.getChannel();
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        String string = "java nio";
        buffer.put(string.getBytes());
        buffer.flip();     //此处必须要调用buffer的flip方法
        channel.write(buffer);
        channel.close();
        outputStream.close();
    }  
}

   通过上面的程序会向工程目录下的data.txt文件写入字符串"java nio",注意在调用channel的write方法之前必须调用buffer的flip方法,否则无法正确写入内容,至于具体原因将在下篇博文中具体讲述Buffer的用法时阐述。

三.Buffer

  Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。具体看下面这张图就理解了:

  上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入到Buffer中,然后再从Buffer中取出数据来处理。

  在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:

  • ByteBuffer
  • IntBuffer
  • CharBuffer
  • LongBuffer
  • DoubleBuffer
  • FloatBuffer
  • ShortBuffer

  如果是对于文件读写,上面几种Buffer都可能会用到。但是对于网络读写来说,用的最多的是ByteBuffer。

  关于Buffer的具体使用以及它的limit、posiion和capacity这几个属性的理解在下一篇文章中讲述。

四.Selector

  Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。

  与Selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑。

  关于Selector类的具体使用将在后续文章中阐述。

  参考资料:

  http://blog.csdn.net/wuxianglong/article/details/6604817

  

http://www.360doc.com/content/12/0515/11/1542811_211144310.shtml

  http://www.iteye.com/topic/834447

  http://weixiaolu.iteye.com/blog/1479656

  http://ifeve.com/overview/

 

 

 

 

分享到:
评论

相关推荐

    底层读写器协议浅析

    因此,RFID标准化组织EPCglobal在2007年推出了底层读写器协议LLRP(Low Level Reader Protocol),它为读写器和其控制器提供了标准的网络接口,极大地提高了RFID应用系统的构建效率。借助于开源的RFID中间件平台...

    论文研究-一种超高频射频识别读写器天线的设计 .pdf

    一种超高频射频识别读写器天线的设计,邵明媚,李秀萍,本文提出了一款工作于超高频的宽带贴片射频识别读写器天线,天线采用双层FR-4介质板结构,底层馈电网络通过同轴线对上层圆形贴片��

    一种UHF频段高极化隔离度双极化 RFID读写器天线设计

    本文主要设计了一个缝隙耦合的微带天线...底层也是介质层,介质层上是接地层,介质层下是馈电。它们的参数设置如下:介质层厚度都为1.6mm;它们的相对介电常数都为4.4;为了增加天线的带宽,这里选择空气层的厚度为25mm。

    JAVA基于SNMP网络设备MIB信息采集设计与实现.doc

    系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...

    JAVA基于SNMP网络设备MIB信息采集(论文+源代码+读书笔记)

    系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...

    基于JAVA毕业设计-JAVA基于SNMP网络设备MIB信息采集(论文+源代码).rar

    系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...

    JAVA基于SNMP网络设备MIB信息采集(论文+源代码)

    系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...

    JAVA基于SNMP网络设备MIB信息采集(论文+源代码).zip

    系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...

    计算机毕业设计 - JAVA基于SNMP网络设备MIB信息采集(论文+源代码) ,保证可靠运行,提供论文范本,可供参考!

    系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...

    基于SNMP网络设备MIB信息采集 的设计

    系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...

    基于java的SNMP网络设备MIB信息采集系统设计与实现毕业设计(说明报告+源代码)

    系统在设定设备IP地址及端口号和读写共同体名后能查看相应设备的基本信息。在加载MIB信息文件后可自动生成MIB树型模式,用户则可根据需要查看设备各项细节,亦可进行设定操作。查看基本信息时,用户可自行选择是否...

    C++网络编程案例详解

    C++网络编程案例详解 流套接字(SOCK_STREAM)  TCP:面向连接的、可靠的  通信连接必须显式建立  适合传输大量的数据,不支持广播和多播  数据报套接字(SOCK_DGRAM)  UDP:无连接的、不可靠的  通信...

    API之网络函数---整理网络函数及功能

    API之网络函数1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一...

    网络安全论文:浅谈一种基于WPDRRC的网络安全模型.doc

    该模型把所有单位的信息分为3个层次存 储,最底层是单个的数据对象(Data),上一层是相应的公司数据集合(CompanyData,C D),最上层是根据利益冲突分类的COI类(ConflictofInterest,COI),每个公司只能属 于一个COI....

    arp的发送和接收

    这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。 然而,有些时候,这种“简单的方式”并不能满足任务...

    winpcap驱动及开发包

    这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。 然而,有些时候,这种“简单的方式”并不能满足任务...

    千万字肝翻Linux内核源码,对底层原理深耕深分析,从入门到入狱

    syncookie、读写分析、NFS实现框架、网络新特性、skb核心操作、HASH算法、过滤框架Nftables、接 收框架、页缓存PageCache、Netfilter框架、处理器架构、中断机制、malloc、free实现原理、内存的 动态、缺页中断、...

    基础深化和提高-IO流技术学习大全

    I/O流技术提供了丰富的功能和特性,使得开发者能够轻松地进行文件的读写、网络通信、处理数据等操作。另外,Java还提供了一些高级的流类,如缓冲流、对象流、数据流等,它们在底层字节流和字符流的基础上提供了更多...

Global site tag (gtag.js) - Google Analytics