前言:近期在研究java netty这个网络框架,第一篇先介绍java的nio。

java nio在jdk1.4引入,事实上也算比較早的了。主要引入非堵塞io和io多路复用。内部基于reactor模式。


nio核心:

- buffer

- channel

- selector

buffer:

相似网络编程中的缓冲区,有

ByteBuffer 字节

CharBuffer 字符

IntBuffer

DoubleBuffer…

经常使用的有ByteBuffer和CharBuffer

java nio buffer是开辟了一块空间。内部有4个标记,分别为position,limit。capicity。mask。



position是当前读缓冲区位置,limit是数据的结尾。表示最多能读到limit位置,capacity是缓冲区的容量。在position和limit之间还会有mask用来标记一个位置,能够移动position到达mask位置

buffer有两个重要的方法clear和flip

clear()方法没有清空数据而是将position置为0,limit置为capacity,

为再次向buffer装数据做好准备

flip()方法在装载完数据后。将limit设为当前position位置,然后将position设置为0,简单来说就是flip()为从buffer中取出数据做好准备。


>

channel:

相似网络编程中的套接字,Java nio中称为Channel(通道),个人觉得这样更加方便我们理解,服务器和客户端之间通过Channel来数据传输。

channel 有

FileChannel 文件管道

DatagramChannel 数据报管道

SocketChannel socket管道

ServerSocketChannel 服务端socket管道

channel能够直接文件的部分或所有映射为buffer

注意:

程序不能直接訪问channel的数据。channel必须和buffer结合起来使用。

所有的channel都不应该用构造器,从传统的流节点Inputstream 等来获取channel


selector:

事件分发收集器,内部封装的epoll。我们能够往上面注冊事件,然后监听多个channel通道上的事件等。


时序图



注:图片非原创

从时序图能够看出java nio和我们平时写的网络编程非常像。


java nio实现简单的回射服务器

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.nio.channels.spi.SelectorProvider;
import java.nio.charset.Charset;
import java.util.Set; /**
* Created by wwh on 15-7-25.
*/
public class NioSocket {
//字符序列和字节序列的编码和解码
private Charset charset = Charset.forName("UTF-8"); void run(String ip, int port) throws IOException {
try {
//创建服务端套接字
ServerSocketChannel server = ServerSocketChannel.open();
//绑定ip和端口
server.socket().bind(new InetSocketAddress(ip, port));
//设置非堵塞
server.configureBlocking(false);
//创建selector事件选择器
Selector selector = Selector.open();
//将自己的监听套接字注冊到selector上。监听 accept事件
//SelectionKey代表SelectableChannel和Selector的关系。Selectable是Selector可监听的事件channel.
server.register(selector, SelectionKey.OP_ACCEPT);
while(selector.select() > 0){
//selector.select()返回事件
for(SelectionKey sk : selector.selectedKeys()) {
//从事件集合中删除正要处理的事件
selector.selectedKeys().remove(sk);
//推断事件的类型,依次处理
if(sk.isAcceptable()){
//假设事件为接受连接accpet事件
System.out.println("accpet 事件");
//调用accept接受请求连接
SocketChannel client = server.accept();
//设置为非堵塞
client.configureBlocking(false);
//向selector上注冊读事件
client.register(selector, SelectionKey.OP_READ);
//将sk相应的channel设置为准备接受其它请求
sk.interestOps(SelectionKey.OP_ACCEPT);
}
if(sk.isReadable()){
//假设事件为可读事件
System.out.println("read 事件");
SocketChannel client = (SocketChannel)sk.channel();
//定义缓冲区
ByteBuffer buffer = ByteBuffer.allocate(1024);
String mesg = "";
try {
while (client.read(buffer) > 0) {
buffer.flip();
mesg += charset.decode(buffer);
}
System.out.println("收到:" + mesg);
sk.interestOps(SelectionKey.OP_READ);
}catch (IOException e){
//假设出现异常,则取消当前的client连接
sk.cancel();
if(sk.channel() != null){
sk.channel().close();
}
}
//回复给发来消息的client
client.write(charset.encode(mesg));
System.out.println("回复:" + mesg);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws IOException {
NioSocket Server = new NioSocket();
Server.run("192.168.10.75", 10000);
}
}

学习 java netty (一) -- java nio的更多相关文章

  1. Java网络编程和NIO详解9:基于NIO的网络编程框架Netty

    Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...

  2. Java IO 学习(四)BIO/NIO

    本文会尝试介绍Java中BIO与NIO的范例与原理 使用的模型非常简单:服务器--客户端模型,服务器会将客户端发送的字符串原样发回来.也就是所谓的echo server. BIO 也就是所谓的Sock ...

  3. Java工程师学习指南第5部分:Java网络编程与NIO

    本文整理了微信公众号[Java技术江湖]发表和转载过的Java网络编程相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧. 深度解读 Tomcat 中的 NIO 模型 [Java基本功]浅 ...

  4. Java NIO 学习笔记(七)----NIO/IO 的对比和总结

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  5. 疯狂Java学习笔记(75)-----------NIO.2第一篇

    Java 7引入了NIO.2.NIO.2是继承自NIO框架,并添加了新的功能(比如:处理软链接和硬链接的功能).这篇帖子包含三个部分,我将使用NIO.2的一些演示样例.由此向大家演示NIO.2的基本用 ...

  6. Java NIO学习笔记---I/O与NIO概述

    文章目录: 1.什么是IO 2.什么是Java NIO 3.I/O常见概念 4.为什么使用NIO 5.IO VS NIO 一.什么是IO I/O 或者输入/输出 , 指的是计算机与外部世界或者一个程序 ...

  7. Java Netty 4.x 用户指南

    问题 今天,我们使用通用的应用程序或者类库来实现互相通讯,比如,我们经常使用一个 HTTP 客户端库来从 web 服务器上获取信息,或者通过 web 服务来执行一个远程的调用. 然而,有时候一个通用的 ...

  8. Java Netty简介

    Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户netty.io(http:// ...

  9. Java网络编程与NIO详解8:浅析mmap和Direct Buffer

    微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...

随机推荐

  1. SnackDown Online Pre-elimination round A

    1. 应该n是偶数,就行吧.应该判断1个人,只能出现一次吧. #include<bits/stdc++.h> #define pb push_back typedef long long ...

  2. A - Word

    Problem description Vasya is very upset that many people on the Net mix uppercase and lowercase lett ...

  3. 题解报告:hdu 1847 Good Luck in CET-4 Everybody!(入门SG值)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1847 Problem Description 大学英语四级考试就要来临了,你是不是在紧张的复习?也许紧 ...

  4. Jenkins自动化部署.netcore程序

    一.安装jenkins 百度一下 二.构建前的准备 搭建好.net core2.0的环境,下载:https://aka.ms/dotnetcore-2-windowshosting  (,net co ...

  5. 5.13redis的相关基础

    二.Redis(NoSql)  Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,官方提供测试数据,50个并发执行 100000个请求,读的速度是110000次/s,写的速 ...

  6. windows 装XP系统

    笔记本型号:HPCQ40-506AX 1.在BIOS中更改启动顺序:将USB设为第一启动项2.插入装有PE系统的USB设备3.开机后一直按F124.到达选择系统界面,目前我的HPCQ40用其他系统进去 ...

  7. HTML学习笔记——DOCTYPE和DTD,标准模式和兼容模式

    主要涉及知识点: HTML与XHTML HTML与XHTML的区别 DOCTYPE与DTD的概念 DTD的分类以及DOCTYPE的声明方式 标准模式(Standard Mode)和兼容模式(Quirc ...

  8. Java导入excel并保存到数据库

    首先建立好excel表格,并对应excel表格创建数据库表. 前台jsp页面:其中包含js <%@ page language="java" import="jav ...

  9. 远程连接Oracle设置

    1:打开net manager:开始->程序->oracle->配置和移植工具->Net Manager 2:添加服务器名->名子自定义,一般根据项目自定义,自己知道就行 ...

  10. MYSQL 45道练习题

    学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表(一)~表(四)所示.用S ...