java之NIO编程

所谓行文如编程,随笔好比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。可以一读多,可以多写一。

完毕。

时间: 2024-08-03 03:31:01

java之NIO编程的相关文章

java socket nio编程

上次写了一个socket的基本编程,但是有个问题,阻塞特别严重,于是小编便去找了nio学习了一下... 1 public class TimeServer { 2 3 public static void main(String[] args) { 4 MultipexerTimeServer timersServer=new MultipexerTimeServer("192.168.1.102", 8400); 5 new Thread(timersServer, "ni

Java之NIO

想要学习Java的Socket通信,首先要学习Java的IO和NIO基础,这方面可以阅读<Java NIO 系列教程>. 下面展示自己代码熟悉Java的NIO编程的笔记. 1.缓冲区(Buffer) /* * 一.缓冲区(Buffer):在Java 中负责数据的存取.缓冲区就是数组.用于存储不同数据类型的数据 *        *       根据数据类型不同(boolean除外),提供了相应类型的缓冲区 *         ByteBuffer 那么实际上最常用的,因为网络传输的字节就是By

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

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51512200,谢谢! 本文会从传统的BIO到NIO再到AIO自浅至深介绍,并附上完整的代码讲解. 下面代码中会使用这样一个例子:客户端发送一段算式的字符串到服务器,服务器计算后返回结果到客户端. 代码的所有说明,都直接作为注释,嵌入到代码中,看代码时就能更容易理解,代码中会用到一个计算结果的工具类,见文章代码部分. 相关的基础知识文章推荐: Linux 网络 I/O 模型简介(图文) Jav

java io 网络编程 高性能NIO

很久没写了,一是觉得这后台不怎么方便,二是 写的时候突然觉得没兴趣了. 还好,今天突然想记一下,那就随便写吧.  1.一开始还是放几个连接.  什么是 同步,异步,阻塞,非阻塞 : http://blog.csdn.net/historyasamirror/article/details/5778378        从Jetty.Tomcat和Mina中提炼NIO构架网络服务器的经典模式:http://blog.csdn.net/cutesource/article/details/61920

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

原文出自:http://blog.csdn.net/anxpp/article/details/51512200 1.BIO编程 1.1.传统的BIO编程 网络编程的基本模型是C/S模型,即两个进程间的通信. 服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信. 传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口:Socket负责发起连接操作.连接成功后,双方通过输入和输出流进

多线程编程、Java I/O系统和Java图形界面编程

多线程编程: 一个正在运行的程序通常称为一个进程,每一个任务称为一个线程,中能够在一个程序内运行多线程的程序称为多线程程序. 线程与进程的区别:①每个进程都需要操作系统为其分配独立的内存空间: ②而同一个进程中的所有线程都在同一内存空间工作,这些线程可以共享同一块内存和系统资源. 线程的创建: 1)通过继承Thread类来创建线程: ①创建一个继承Thread类的类: ②在创建的Thread子类中重写run()方法,在方法中写入想要线程运行的代码: ③创建Thread子类的实例: ④通过调用该实

Java异步NIO框架Netty实现高性能高并发

1. 背景 1.1. 惊人的性能数据 近期一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用.相比于传统基于Java序列化+BIO(同步堵塞IO)的通信框架.性能提升了8倍多. 其实,我对这个数据并不感到吃惊,依据我5年多的NIO编程经验.通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精心的设计Reactor线程模型,达到上述性能指标是全然有可能的. 以下我们就一起来看下Ne

JAVA bio nio aio

[转自]http://qindongliang.iteye.com/blog/2018539 在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 什么是异步阻塞? 8 什么是异步非阻塞? 散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词.如有不足之处,还望告知. 在弄清楚上面的几个问题之前,我们首先得明白什么是同步,

【Socket】Java Socket基础编程

Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基本示例 二.消息通信优化 2.1 双向通信,发送消息并接受消息 2.2 使用场景 2.3 如何告知对方已发送完命令 2.3.1 通过Socket关闭 2.3.2 通过Socket关闭输出流的方式 2.3.3 通过约定符号 2.3.4 通过指定长度 三.服务端优化 3.1 服务端并发处理能力 3.2