NIO
fan2012huan
这个作者很懒,什么都没留下…
展开
-
NIO边看边记 之 概述(一)
声明:《NIO边看边记》系列的文章在学习NIO时,看到了并发编程网上有一个NIO系列教程。感觉写的不错,挺系统,于是边看边记了下来,相当于笔记吧。不是故意侵权。并发编程网 NIO教程系列 JDK1.4之后,java推出了NIO(New IO)。JDK1.4之前的IO只能基于流(stream)的方式逐个字节逐个字节的读取和写入。流处理方式性能比较低;NIO采用块的方式(Buffer)处理数据,性能大原创 2016-05-04 20:53:31 · 641 阅读 · 0 评论 -
NIO边看边记 之 selector选择器(六)
Selector(选择器)可同时监听多个通道上感兴趣的事件(如accept事件、read就绪事件、write就绪事件)。使用Selector可以实现一个线程管理多个通道,进而可以管理多个连接。1.为什么要使用Selector如果不使用Selector要监听多个channel上感兴趣的事件,则需要多线程操作,一个线程监听一个通道的事件。这样导致线程上下文切换的开销(内存)、增加了编程的复杂度。2.Se原创 2016-05-04 21:20:41 · 4826 阅读 · 0 评论 -
NIO边看边记 之 Buffer(三)
缓冲区Buffer其实就是一块内存区域。用于和channel来进行数据交互。从channel中读取数据到buffer,将buffer中的数据写到channel中。这块内存区域在java NIO中被封装成Buffer对象。Buffer的基本用法使用buffer进行读写数据一般会经过如下4个步骤: (1)从channel中读取数据写到buffer中 (2)调用buffer的flip()方法切换buf原创 2016-05-04 21:02:09 · 649 阅读 · 0 评论 -
NIO边看边记 之 SocketChannel(八)
SocketChannel是一个连接到TCP的网络套接字通道。创建SocketChannel有两种方式: a.打开一个SocketChannel并连接到一台网络服务器 b.一个新连接到达ServerSocketChannel时,会创建一个SocketChannel1.打开SocketChannel socketChannel = SocketChannel.open(); socketChan原创 2016-05-04 21:25:42 · 473 阅读 · 0 评论 -
NIO边看边记 之 管道Pipe(十一)
NIO支持管道操作。管道模型如下所示: 管道通常用来两个线程来传输数据。 其中SinkChannel用于往Pipe中写数据,SourceChannel用于从Pipe中读数据。 1.创建管道Pipe pipe = Pipe.open();2.写管道Pipe.SinkChannel sinkChannel = pipe.sink();String newData = "New String原创 2016-05-04 21:34:14 · 1407 阅读 · 0 评论 -
NIO边看边记 之 DatagramChannel(十)
DatagramChannel是用于UDP网络的通道。 其打开、绑定、关闭操作跟SocketChannel一样。 由于使用的时UDP因此在读写数据时未必能保证可靠。 1.接收数据 通过receive()方法从DatagramChannel接收数据,如:ByteBuffer buf = ByteBuffer.allocate(48);buf.clear();channel.receive(原创 2016-05-04 21:32:17 · 883 阅读 · 0 评论 -
NIO边看边记 之 ServerSocketChannel(九)
ServerSocketChannel是一个监听新进来TCP连接的通道。 1.打开ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();2.绑定serverSocketChannel.socket().bind(new InetSocketAddress(9999));3.关闭serverSocketChannel原创 2016-05-04 21:27:31 · 541 阅读 · 0 评论 -
NIO边看边记 之 FileChannel(七)
FileChannel不可工作在非阻塞模式,不可以将FileChannel注册到Selector上。1.打开FileChannel不能直接打开,需要通过一个与之关联的FileInputStream、FileOutputStream或者RandomAccessFile来获得FilChannel。 如:RandomAccessFile randomAccessFile = new RandomAcce原创 2016-05-04 21:23:24 · 2030 阅读 · 0 评论 -
NIO边看边记 之 通道之间的数据传输(五)
两个通道之间可以相互传输数据,但是至少一个通道得是文件channel。1.transferFrom()从一个channel中传输到另一个channel,目的channel作为调用方。 实例代码如下:RandomAccessFile fromFile = new RandomAccessFile("fromFile.txt", "rw");FileChannel fromChannel原创 2016-05-04 21:10:28 · 659 阅读 · 0 评论 -
NIO边看边记 之 Scatter/Gather(四)
1.ScatterScatter(分散)操作是指可以将从channel中读取的内容分散的写到不同的buffer中。注意必须要先将前面的buffer写满之后才能写后面的buffer。因此,Scatter操作不支持动态消息(即不确定大小的消息) 实例代码如下:ByteBuffer header = ByteBuffer.allocate(128);ByteBuffer body = Byte原创 2016-05-04 21:07:33 · 704 阅读 · 0 评论 -
NIO边看边记 之 channel(二)
通道channel就像流。通道中的数据总是先读到到buffer中(对于buffer来说是一个写操作),再从buffer中写到另一个通道总(相对于buffer来说是一个读操作)。 Channel主要分为两类:文件channel和网络channel,细分为4种。 FileChanel:从普通文件中读写数据 DatagramChannel:通过UDP读写网络中的数据 SocketChannel原创 2016-05-04 20:57:33 · 612 阅读 · 1 评论 -
fcgi4j与PHP-FPM通信遇到的问题
一.前言前一篇文章介绍了一些CGI、FCGI相关的概念,详见 理解CGI、FCGI、php-cgi、php-fpm的概念 。从这篇文章知道PHP-FPM是PHP实现FCGI协议的一个组件,负责FCGI协议编码的请求的解析和转发。 fcgi4j是一个Java解析fcgi协议的组件,其git地址为:fcgi4j github。二.问题在工作中遇到的问题: 在线上,当PHP-FPM对数据包进行分包,f原创 2017-03-25 16:03:09 · 797 阅读 · 0 评论