Java NIO Test Case
package org.zwl.test.nio; import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.Future;
import java.util.concurrent.atomic.AtomicInteger; /**
* @author zhenweiliu created on 3/6/14
*/
public class NioServer { private Selector selector;
private AtomicInteger acceptCount = new AtomicInteger(0);
private AtomicInteger readCount = new AtomicInteger(0);
private AtomicInteger writeCount = new AtomicInteger(0); public NioServer(int port) throws IOException {
ServerSocketChannel ssc = ServerSocketChannel.open(); // 使用默认的selector provider生成一个channel
ssc.configureBlocking(false); // 设置为非阻塞模式
ssc.bind(new InetSocketAddress(port)); // 绑定到端口
selector = Selector.open();
ssc.register(selector, SelectionKey.OP_ACCEPT); // 将channel注册到selector, 并指定其兴趣集事件 while (selector.select() > 0) { // select()是个阻塞方法, 只有当selector中有已经准备好的事件的时候才会返回, 它返回已经准备好的事件数
for (SelectionKey key : selector.selectedKeys()) { // 遍历已经准备好的事件的key
selector.selectedKeys().remove(key);
if (key.isAcceptable()) {
System.out.println("Accept client " + acceptCount.incrementAndGet());
SocketChannel sc = ((ServerSocketChannel) key.channel()).accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
} else if (key.isReadable()) {
System.out.println("Read client " + readCount.incrementAndGet());
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer bb = ByteBuffer.allocate(1024);
bb.clear();
try {
while (sc.read(bb) > 0) {
bb.flip();
System.out.print(StandardCharsets.UTF_8.decode(bb));
bb.clear();
}
System.out.println();
} catch (IOException e) {
sc.close();
} if (key.isWritable()) {
System.out.println("Write client " + writeCount.incrementAndGet());
bb.clear();
bb.put("Hello Client".getBytes());
bb.flip();
try {
while (bb.hasRemaining()) {
sc.write(bb);
}
} catch (Exception e) {
sc.close();
}
}
}
}
}
} public static void main(String[] args) throws IOException {
new NioServer(8089);
}
}
package org.zwl.test.nio; import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.util.concurrent.ExecutionException; import static java.nio.channels.SelectionKey.OP_CONNECT;
import static java.nio.channels.SelectionKey.OP_READ;
import static java.nio.channels.SelectionKey.OP_WRITE; /**
* @author zhenweiliu created on 3/6/14
*/
public class NioClient { public NioClient(String host, int port) throws Exception {
Selector selector = Selector.open();
SocketChannel sc = SocketChannel.open(new InetSocketAddress(host, port));
sc.configureBlocking(false);
SelectionKey sk = sc.register(selector, OP_CONNECT | OP_READ | OP_WRITE);
new ClientWriteThread(sk).start();
while (selector.select() > 0) {
for (SelectionKey key : selector.selectedKeys()) {
selector.selectedKeys().remove(key);
SocketChannel sc2 = (SocketChannel) key.channel();
if (key.isConnectable()) {
System.out.println("Connection established");
} else if (key.isReadable()) {
System.out.println("Read Server");
ByteBuffer bb = ByteBuffer.allocate(128);
bb.clear();
while (sc2.read(bb) > 0) {
bb.flip();
System.out.print(StandardCharsets.UTF_8.decode(bb));
bb.clear();
}
System.out.println();
}
}
}
} private static class ClientWriteThread extends Thread { private SelectionKey key; private Scanner scanner = new Scanner(System.in); public ClientWriteThread(SelectionKey key) {
this.key = key;
} @Override
public void run() {
while (key.isWritable()) {
String msg = scanner.nextLine();
ByteBuffer bb = ByteBuffer.allocate(msg.getBytes().length);
bb.clear();
bb.put(msg.getBytes());
bb.flip();
try {
while (bb.hasRemaining()) {
((SocketChannel) key.channel()).write(bb);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} public static void main(String[] args) throws Exception {
new NioClient("localhost", 8089); }
}
使用selector的好处在于
1. selector可以使用一个线程同时监听多个channel,他们的事件准备由系统通知, 类似于事件驱动, 不需要自己手动缓存所有chanel, 并while去轮询, 这样效率高
2. 他的read write方法都是非阻塞方法, 返回的是本次操作写入(或读取)成功的数据字节数
Java NIO Test Case的更多相关文章
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- Five ways to maximize Java NIO and NIO.2--reference
Java NIO -- the New Input/Output API package-- was introduced with J2SE 1.4 in 2002. Java NIO's purp ...
- 【NIO】Java NIO之选择器
一.前言 前面已经学习了缓冲和通道,接着学习选择器. 二.选择器 2.1 选择器基础 选择器管理一个被注册的通道集合的信息和它们的就绪状态,通道和选择器一起被注册,并且选择器可更新通道的就绪状态,也可 ...
- java NIO详解
http://zalezone.cn/2014/09/17/NIO%E7%B2%BE%E7%B2%B9/ 1. 前言 我们在写java程序的时候,为了进行优化,把全部的精力用在了处理效率上,但是对IO ...
- Java NIO之选择器
1.简介 前面的文章说了缓冲区,说了通道,本文就来说说 NIO 中另一个重要的实现,即选择器 Selector.在更早的文章中,我简述了几种 IO 模型.如果大家看过之前的文章,并动手写过代码的话.再 ...
- android升级后错误:Unable to execute dex: java.nio.BufferOverflowException.Check
Android SDK Tools升级为22.3,Android SDK Platform-tools 升级为19后,编译工程出现错误: Unable to execute dex: java.nio ...
- IO的详细解释:It's all about buffers: zero-copy, mmap and Java NIO
There are use cases where data need to be read from source to a sink without modification. In code t ...
- Java NIO Files
Java NIO Files Files.exists() Files.createDirectory() Files.copy() Overwriting Existing Files Files. ...
- java NIO Buffer 详解(1)
1.java.io 最为核心的概念是流(stream),面向流的编程,要么输入流要么输出流,二者不可兼具: 2.java.nio 中拥有3个核心概念: Selector Channel, Buffe ...
随机推荐
- 7-11Zombie's Treasure Chest uva12325
题意 你有一个体积为N的箱子和两种数量无限的宝物 宝物1的体积为s1 价值为v1 宝物2同理 输入均为32位带符号整数 你的任务是计算最多能带走多少价值的宝物 暴力枚举: 首先明白一点 ...
- All Friends 极大团
搞懂了什么是团 什么是极大团 什么是最大团 极大团就是 不是任何团的真子集 最大团就是点数最多的极大团 这题就是求极大团的个数 用bk算法 #include <iostream> ...
- java数据结构之树
树定义和基本术语定义树(Tree)是n(n≥0)个结点的有限集T,并且当n>0时满足下列条件: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结 ...
- Cdq分治整体二分学习记录
这点东西前前后后拖了好几个星期才学会……还是自己太菜啊. Cdq分治的思想是:把问题序列分割成左右两个,先单独处理左边,再处理左边对右边的影响,再单独处理右边.这样可以消去数据结构上的一个log,降低 ...
- eclipse闪退解决(转)
最近帮同事解决一个eclipse闪退解决的问题,从网上找了N多方法皆无效,最后用一个园友的博客上的方法解决了,特转载一下. 解决办法: 删除文件 [workspace]/.metadata/.plug ...
- inline关键字的作用
一.在C&C++中,inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 如下面一宏定义表达式: #define express(v1,v2) (v1 ...
- 微信小程序自定义组件封装及父子间组件传值
首先在我们可以直接写到需要的 page 中,然后再进行抽取组件,自定义组件建议 wxzx-xxx 命名 官网地址:https://developers.weixin.qq.com/miniprogra ...
- 使用GSON和泛型解析约定格式的JSON串(转)
时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...
- Understanding the STM32F0's GPIO
Understanding the STM32F0's GPIO This is the first part of the GPIO tutorial for the STM32F0Discover ...
- 荣耀 6 安装 SD 卡,提示:SD卡已安全移除
先前买了个 荣耀6(购买链接),自带存储只有 16G,用来一段时间后,老是提示存储不足.后来发现是 微信 等软件占用了好多存储(缓存),, 好吧,在京东上买了个 64G 扩展卡(购买链接),安装过程如 ...