所谓行文如编程,随笔好比java文件,文章好比类,参考文献是import,那么目录就是方法定义。

本篇文章处在分析thrift的nonblocking server之前,因为后者要依赖该篇文章的知识。若两文同一篇,那即是两类共享同一文件,其中有一个必为public,若一文在另一文中,即为内部类。按编程规范,还是分成两篇来写为好。

java之NIO详解系列文章,比较好的,还是推荐这篇http://tutorials.jenkov.com/java-nio/overview.html。本文只是简略总结一下。一为备忘,二为忘了很快能够拾起。所以遍观本博所写,大都勾画而已,点到即止。所以者何?所谓语言编程,框架工具,异步请求,各种协议,模型演化,参数配置,随用随弃,随拿随起,翻手为云,覆手为雨,三层以上,存而不议,三层而下,勤勤演习。所以者何?孔子曰:君子不器!

上面罗嗦了一番,下面开始进入正题。

java NIO主要部件为Buffer、Channel、Selector。Buffer对应数据,Channel对应连接,Selector是所有向其注册了的Channel的管理器和监控器。

与java IO相比,前者(IO)好比直播,后者就是自己播放,可以前进,可以后退;前者每个连接的操作都是阻塞的,一般做法是单开一个线程处理一个连接,如上一篇的threadpool server的做法,后者可以一个线程管理多个连接,即通过Selector的事件方式管理名下的Channel,把阻塞上移,移到了Selector的select函数中去了。

使用Buffer可以操纵Channel的读写,使用Selector可以监视Channel的事件,下面放一段代码,其意自明。

Selector selector = Selector.open();

channel.configureBlocking(false);

SelectionKey key = channel.register(selector, SelectionKey.OP_READ);

while(true) {

  int readyChannels = selector.select();

  if(readyChannels == 0) continue;

  Set<SelectionKey> selectedKeys = selector.selectedKeys();

  Iterator<SelectionKey> keyIterator = selectedKeys.iterator();

  while(keyIterator.hasNext()) {

    SelectionKey key = keyIterator.next();

    if(key.isAcceptable()) {
// a connection was accepted by a ServerSocketChannel. } else if (key.isConnectable()) {
// a connection was established with a remote server. } else if (key.isReadable()) {
// a channel is ready for reading } else if (key.isWritable()) {
// a channel is ready for writing
} keyIterator.remove();
}
}

跟channel读写关联的比较有用的工具类是Scatter / Gather。可以一读多,可以多写一。

完毕。

java之NIO编程的更多相关文章

  1. java socket nio编程

    上次写了一个socket的基本编程,但是有个问题,阻塞特别严重,于是小编便去找了nio学习了一下... public class TimeServer { public static void mai ...

  2. Java之NIO

    想要学习Java的Socket通信,首先要学习Java的IO和NIO基础,这方面可以阅读<Java NIO 系列教程>. 下面展示自己代码熟悉Java的NIO编程的笔记. 1.缓冲区(Bu ...

  3. 深入学习Netty(2)——传统NIO编程

    前言 学习Netty编程,避免不了从了解Java 的NIO编程开始,这样才能通过比较让我们对Netty有更深的了解,才能知道Netty大大的好处.传统的NIO编程code起来比较麻烦,甚至有遗留Bug ...

  4. (转)Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    原文出自:http://blog.csdn.net/anxpp/article/details/51512200 1.BIO编程 1.1.传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间 ...

  5. Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为 ...

  6. Java IO编程全解(四)——NIO编程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7793964.html 前面讲到:Java IO编程全解(三)——伪异步IO编程 NIO,即New I/O,这 ...

  7. java基础-网络编程(Socket)技术选型入门之NIO技术

    java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...

  8. Java 网络IO编程(BIO、NIO、AIO)

    本概念 BIO编程 传统的BIO编程 代码示例: public class Server { final static int PROT = 8765; public static void main ...

  9. JAVA bio nio aio

    [转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? ...

随机推荐

  1. eclipse 编辑 python 中文乱码的解决方案

    今天在学习python时做了一个用户输入一个目录地址,再输入内容,然后将输入的内容存入输入的目录文件中: 具体代码如下: #coding:utf- ''' Created on -- @author: ...

  2. C++学习笔记4——类的封装(2)

    简介: 重载的运算符是具有特殊名字的函数:它们的名字由关键字operator和其后要定义的运算符号共同组成.其中一元运算符有一个参数,二元运算符有两个参数. 可以被重载的运算符 + - * / % ^ ...

  3. d037: 鸡兔同笼

    内容: 鸡兔同笼中头的总数,脚的总数,求鸡兔各多少只 输入说明: 一行两个整数分别表示头.脚总数(保证有解,当然有可能解为0) 输出说明: 一行两个整数,分别表示鸡.兔的只数 输入样例:   20 4 ...

  4. python面试题大全

    注:本面试题来源于网络,转载请注明来自http://www.cnblogs.com/goodhacker/p/3366618.html. 1. (1)python下多线程的限制以及多进程中传递参数的方 ...

  5. HTML CSS简介与图片映射

    1. CSS 入门 内联样式:在 HTML 元素中使用 “style” 属性,需要将表现与内容混在一起: 内部样式表:在 HTML 文档头部 <head> 区域使用 <style&g ...

  6. C51 库函数(2)

    3.2 STDIO.H:一般I/O函数 C51编译器包含字符I/O函数,它们通过处理器的串行接口操作,为支持其它I/O机制,只需修改getkey()和putchar()函数,其它所有I/O支持函数依赖 ...

  7. 生产环境下,不建议用早期版本的Mono........

    一个BUG修复需要4年!!!!!!!!!!!!!也是醉了....不造被微软收购后的Xamarin会不会好起来

  8. Spring Data Elasticsearch

    项目清单   elasticsearch服务下载包括其中插件和分词   http://download.csdn.net/detail/u014201191/8809619   项目源码   资源文件 ...

  9. [Design Pattern] Command Pattern 简单案例

    Command Pattern, 即命令模式,把一个命令包裹在一个对象里面,将命令对象传递给命令的执行方,属于行为类的设计模式 下面是命令模式的一个简单案例. Stock 代表被操作的对象.Order ...

  10. maven + selenium + jenkins 教程收集

    maven + selenium + jenkins 教程收集 Complete Guide for Selenium integration with jenkins Maven http://le ...