nio

Java NIO框架Mina、Netty、Grizzly介绍与对比

亡梦爱人 提交于 2020-03-16 17:27:44
Mina: Mina(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 Mina 版本2.04支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序,Mina 所支持的功能也在进一步的扩展中。目前,正在使用 Mina的应用包括:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、 Openfire等等。 Netty: Netty是一款异步的事件驱动的网络应用框架和工具,用于快速开发可维护的高性能、高扩展性协议服务器和客户端。也就是说,Netty是一个NIO客户端/服务器框架,支持快速、简单地开发网络应用,如协议服务器和客户端。它极大简化了网络编程,如TCP和UDP套接字服务器。 Grizzly: Grizzly是一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVA NIO作为基础,并隐藏其编程的复杂性。容易使用的高性能的API

09. Java NIO SocketChannel 套接字通道

99封情书 提交于 2020-03-16 12:00:33
某厂面试归来,发现自己落伍了!>>> 在Java NIO体系中,SocketChannel是用于TCP网络连接的套接字接口,相当于Java网络编程中的Socket套接字接口。创建SocketChannel主要有两种方式,如下: 打开一个SocketChannel并连接网络上的一台服务器。 当ServerSocketChannel接收到一个连接请求时,会创建一个SocketChannel。 建立一个SocketChannel连接 打开一个SocketChannel可以这样操作: SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80)); 关闭一个SocketChannel连接 关闭一个SocketChannel只需要调用他的close方法,如下: socketChannel.close(); 从SocketChannel中读数据 从一个SocketChannel连接中读取数据,可以通过read()方法,如下: ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = socketChannel.read(buf); 首先需要开辟一个Buffer

NIO socket 的简单连接池

元气小坏坏 提交于 2020-03-16 11:52:13
某厂面试归来,发现自己落伍了!>>> 在最近的项目中,需要写一个socket 与 底层服务器通信的模块。在设计中,请求对象被封装 xxxRequest,消息返回被封装为 xxxResponse. 由于socket的编程开发经验少,一开始我使用了短连接的方式,每个请求建立一个socket通信,由于每个socket只进行一次读写,这大大浪费了 系统资源。 于是考虑使用长连接,系统公用一个client socket 并对send 操作进行加锁,结果在处理并发的时候,各种慢,各种等待。没有办法,考虑使用两节池,预先创建多个 client socket 放入 连接池,需要发送请求时从连接池获取一个socket,完成请求时放入连接池中。下面是一个简单的实现。 private static String IP=GlobalNames.industryIP; private static int PORT =Integer.parseInt(GlobalNames.industryPort); private static int CONNECTION_POOL_SIZE = 10; private static NIOConnectionPool self = null; private Hashtable<Integer, SocketChannel> socketPool = null; /

Java NIO系列教程(八) SocketChannel

纵然是瞬间 提交于 2020-03-16 11:51:54
某厂面试归来,发现自己落伍了!>>> 原文链接 作者: Jakob Jenkov Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel: 打开一个SocketChannel并连接到互联网上的某台服务器。 一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。 打开 SocketChannel 下面是SocketChannel的打开方式: SocketChannel socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80)); 关闭 SocketChannel 当用完SocketChannel之后调用SocketChannel.close()关闭SocketChannel: socketChannel.close(); 从 SocketChannel 读取数据 要从SocketChannel中读取数据,调用一个read()的方法之一。以下是例子: ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = socketChannel.read(buf);

Java中的IO与NIO

故事扮演 提交于 2020-03-15 18:09:41
前文开了 高并发 学习的头,文末说了将会选择NIO、RPC相关资料做进一步学习,所以本文开始学习NIO知识。 IO 知识回顾 在学习NIO前,有必要先回顾一下IO的一些知识。 IO 中的流 Java程序通过流(Stream)来完成输入输出。流是生产或者消费信息的抽象,流通过Java的输入输出与物理设备连接,尽管与之相连的物理设备不尽相同,但是所有的流的行为都是一样的,所以相同的输入输出类的功能和方法适用于所有的外部设备。这意味着一个输入流可以抽象多种类型的输入,比如文件、键盘或者网络套接字等,同样的,一个输出流也可以输出到控制台、文件或者相连的网络。 流的分类 从功能上可以将流分为输入流和输出流。输入和输出是相对于程序来说的,程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。若程序是数据的源,对外输出数据,我们就称这个数据流相对于程序来说是输出流,若程序是数据的目的地,我们就称这个数据流相对于程序来说是输入流。 从结构上可以将流分为字节流和字符流,字节流以字节为处理单位,字符流以字符为处理单位。 从角色上可以将流分为节点流和过滤流。从特定的地方读写的流叫做节点流,如磁盘或者一块内存区域,而过滤流则以节点流作为输入或者输出,过滤流是使用一个已经存在的输入流或者输出流连接来创建的。 字节流的输入流和输出流的基础是InputStream和OutputStream

NIO 之 Selector实现原理

与世无争的帅哥 提交于 2020-03-15 10:44:10
相关文章 NIO 之 ByteBuffer实现原理 NIO 之 Channel实现原理 BIO、NIO、AIO 内部原理分析 概述 Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。 这是在一个单线程中使用一个Selector处理3个Channel的图示: selector与channel关系 要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。 Selector 作用 仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源(如内存)。因此,使用的线程越少越好。 Selector能够在单个线程中处理多个通道,这样可以减少多个线程造成上下文切换问题。 Selector 源码分析 public abstract class Selector implements Closeable { protected Selector() { } public

jdk的Selector源码分析(一)Selector概述

别来无恙 提交于 2020-03-15 10:39:44
1系列内容 jdk Selector设计情况 jdk nio poll在linux平台下的实现 jdk nio epoll在linux平台下的实现 netty 原生epoll在linux平台下的实现 epoll的2种通知模式边缘触发、水平触发 2 jdk Selector概述 首先来看下文档描述 2.1 创建方式 一个就是直接调用open方法 public static Selector open() throws IOException { return SelectorProvider.provider().openSelector(); } 或者调用选用某个SelectorProvider的openSelector public abstract AbstractSelector openSelector() 2.2 SelectionKey 一个Selector有3种SelectionKey集合 一种就是全部注册的SelectionKey集合,即keys()方法返回的结果 一种就是活跃的SelectionKey集合,即selectedKeys()方法返回的结果 第三种就是已取消的SelectionKey集合,这些已被取消但是还未从Selector取消注册 再确认下下面的几个问题: 什么叫注册 即将一个channel感兴趣的事件注册到Selector上,即如下方法

我所理解的NIO

北慕城南 提交于 2020-03-15 10:39:26
在Java的NIO中,有三个比较重要的概念:Buffer、Channel和Selector。 结合上一篇文章提到的送花的例子。Buffer对应花,Channel对应A和B与花之间的联系,Selector就是不断进行轮询的线程。 Channel 分为ServerSocketChannel和SocketChannel,是客户端与服务端进行通信的通道。 ServerSocketChannel用户服务器端,职责就是监听客户端的连接请求。一旦通过允许,就会建立与该客户端对应的SocketChannel。一个服务端的一个端口只能建立一个ServerSocketChannel用来监听连接。 SocketChannel具有唯一性。一个客户端可能链接多个服务端,那就是多个SocketChannel。服务端与多个客户端建立的连接就有多个SocketChannel。 Selector 是用来负责阻塞轮询的线程,可以通过其静态方法Seletor.open()创建。服务端创建后通过Channel的register方法注册到ServerSocketChannel上,等待客户端连接。客户端同样创建Seletor后通过Channel的register方法注册到SocketChannel上。 当客户端的SocketChannel指定服务端的port和ip进行connect请求之后

Java NIO框架Netty教程(一) – Hello Netty

穿精又带淫゛_ 提交于 2020-03-15 10:17:14
先啰嗦两句,假设你还不知道Netty是做什么的能做什么。那能够先简单的搜索了解一下。我仅仅能说Netty是一个NIO的框架,能够用于开发分布式的Java程序。详细能做什么,各位能够尽量发挥想象。技术,是服务于人而不是局限住人的。 假设你已经万事具备,那么我们先从一段代码開始。程序猿们习惯的上手第一步,自然是"Hello world",只是Netty官网的样例却偏偏抛弃了"Hello world"。那我们就自己写一个最简单的"Hello world"的样例,作为上手。 /** * Netty 服务端代码 * * @author lihzh * @alia OneCoder * @blog http://www.coderli.com */ public class HelloServer { public static void main(String args[]) { // Server服务启动器 ServerBootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); // 设置一个处理client消息和各种消息事件的类(Handler)

Java多线程:Linux多路复用,Java NIO与Netty简述

蓝咒 提交于 2020-03-15 10:11:48
JVM的多路复用器实现原理 Linux 2.5以前:select/poll Linux 2.6以后: epoll Windows: Winsock的select模型(感谢评论指正,仅Java NIO.2使用了Windows IOCP,由于Netty没有采用NIO.2此处不展开) Free BSD, OS X: kqueue 下面仅讲解Linux的多路复用。 Linux中的IO Linux的IO将所有外部设备都看作文件来操作,与外部设备的操作都可以看做文件操作,其读写都使用内核提供的系统调用,内核会返回一个文件描述符(fd, file descriptor),例如socket读写使用socketfd。描述符是一个索引,指向内核中一个结构体,应用程序对文件的读写通过描述符完成。 一个基本的IO,涉及两个系统对象:调用这个IO进程的对象,系统内核,read操作发生时流程如下: 通过read系统调用向内核发起读请求。 内核向硬件发送读指令,并等待读就绪。 内核把将要读取的数据复制到描述符所指向的内核缓存区中。 将数据从内核缓存区拷贝到用户进程空间中。 Linux I/O模型简介 阻塞I/O模型:最常用,所有文件操作都是阻塞的。 非阻塞I/O模型:缓冲区无数据则返回,一般采用轮询的方式做状态检查。 I/O复用模型:详细见下 信号驱动I/O:使用信号回调应用,内核通知用户何时开启一个I/O操作