学习 java netty (一) -- java nio
前言:近期在研究java netty这个网络框架,第一篇先介绍java的nio。
java nio在jdk1.4引入,事实上也算比較早的了。主要引入非堵塞io和io多路复用。内部基于reactor模式。
nio核心:
- buffer
- channel
- selector
buffer:
相似网络编程中的缓冲区,有
ByteBuffer 字节
CharBuffer 字符
IntBuffer
DoubleBuffer…
经常使用的有ByteBuffer和CharBufferjava 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的更多相关文章
- Java网络编程和NIO详解9:基于NIO的网络编程框架Netty
Java网络编程和NIO详解9:基于NIO的网络编程框架Netty 转自https://sylvanassun.github.io/2017/11/30/2017-11-30-netty_introd ...
- Java IO 学习(四)BIO/NIO
本文会尝试介绍Java中BIO与NIO的范例与原理 使用的模型非常简单:服务器--客户端模型,服务器会将客户端发送的字符串原样发回来.也就是所谓的echo server. BIO 也就是所谓的Sock ...
- Java工程师学习指南第5部分:Java网络编程与NIO
本文整理了微信公众号[Java技术江湖]发表和转载过的Java网络编程相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧. 深度解读 Tomcat 中的 NIO 模型 [Java基本功]浅 ...
- Java NIO 学习笔记(七)----NIO/IO 的对比和总结
目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...
- 疯狂Java学习笔记(75)-----------NIO.2第一篇
Java 7引入了NIO.2.NIO.2是继承自NIO框架,并添加了新的功能(比如:处理软链接和硬链接的功能).这篇帖子包含三个部分,我将使用NIO.2的一些演示样例.由此向大家演示NIO.2的基本用 ...
- Java NIO学习笔记---I/O与NIO概述
文章目录: 1.什么是IO 2.什么是Java NIO 3.I/O常见概念 4.为什么使用NIO 5.IO VS NIO 一.什么是IO I/O 或者输入/输出 , 指的是计算机与外部世界或者一个程序 ...
- Java Netty 4.x 用户指南
问题 今天,我们使用通用的应用程序或者类库来实现互相通讯,比如,我们经常使用一个 HTTP 客户端库来从 web 服务器上获取信息,或者通过 web 服务来执行一个远程的调用. 然而,有时候一个通用的 ...
- Java Netty简介
Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户netty.io(http:// ...
- Java网络编程与NIO详解8:浅析mmap和Direct Buffer
微信公众号[黄小斜]作者是蚂蚁金服 JAVA 工程师,目前在蚂蚁财富负责后端开发工作,专注于 JAVA 后端技术栈,同时也懂点投资理财,坚持学习和写作,用大厂程序员的视角解读技术与互联网,我的世界里不 ...
随机推荐
- word文档去掉复制过来的背景颜色
选择清除格式
- NGinx 负载均衡作用
1.负载均衡介绍: 负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助.其工作模式为将外部发送来的请求均匀分配到对称结构中的 ...
- 努比亚 Z17 mini s (Nubia NX589J) 解锁BootLoader 并刷入recovery ROOT
首先下载好工具链接:链接:https://pan.baidu.com/s/1gher4T9 密码:rypn 备用下载链接:https://pan.baidu.com/s/1nxdzt9Z 本篇教程教你 ...
- Boost-QT兼容问题:#define FUSION_HASH #
使用原始的MSVC10+QT48很长时间,需要把PCL升级到新的版本,不再使用自行编译的PCL1.7.2版本. 在使用MSVC2012的时候,使用MSVC12-的PCL1.8.0版本,出现了一个不大不 ...
- c++ 枚举与字符串 比较
读取字符串,然后将这个字符转换为对应的枚举. 如:从屏幕上输入'a',则转换为set枚举中对应的a,源代码如下: //关键函数为char2enum(str,temp); #include using ...
- 竞品分析」项目协作管理平台-Teambition和CORNERSTONE--深度体验
一.分析目的 通过分析2B产品中的团队协作管理软件的对比分析,用于为公司团队协作软件的选型做产考. 二.竞品归属市场概况 2.1.目标用户群及需求 主要面向企业用户,用于解决企业不同地域以及不同职能部 ...
- icheck使用
1.使用: <link rel="stylesheet" href="css/skins/all.css">或者<link rel=" ...
- [NOI2015]软件包管理器 树链剖分_线段树
没有太大难度,刷水有益健康 Code: // luogu-judger-enable-o2 #include <bits/stdc++.h> #define setIO(s) freope ...
- DFS-BFS深度优选遍历和广度优先遍历
https://www.jianshu.com/p/b086986969e6 DFS--需要借助stack实现 stack.push stack.pop BFS--需要借助队列queue stack- ...
- bos开发时,测试卡在登录界面解决
在BOS工作空间工程路径下新建sp文件夹,如在E:\bosworkspace8.2\Project_0\lib 新建sp文件夹E:\bosworkspace8.2\Project_0\lib\sp.然 ...