JAVA nio 简单使用
nio 模拟客户端和服务器互相通讯--传输一个int值,并且不断的+1;
服务器,单线程
public class Server {
public static void main(String[] args) {
try {
ServerSocketChannel server=ServerSocketChannel.open().bind(new InetSocketAddress(8881));
server.configureBlocking(false);
Selector selector=Selector.open();
server.register(selector,SelectionKey.OP_ACCEPT);
for(;;) {
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> iterator = keys.iterator();
while(iterator.hasNext()) {
SelectionKey next = iterator.next();
if(next.isAcceptable()) {
acceptHandle(next, selector);
}
if (next.isReadable()) {
doRead(next, selector);
}
iterator.remove();
}
Thread.sleep(2000);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void acceptHandle(SelectionKey key,Selector selector) throws IOException {
ServerSocketChannel serverShannel =(ServerSocketChannel) key.channel();
SocketChannel channel = serverShannel.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ,ByteBuffer.allocate(1024));
}
public static void doRead(SelectionKey key,Selector selector) throws IOException {
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer buffer =(ByteBuffer) key.attachment();
buffer.clear();
int read = socketChannel.read(buffer);
int msg=buffer.getInt(0);
System.out.println("服务器收到客户端"+socketChannel.getLocalAddress()+" "+msg);
buffer.rewind();
buffer.putInt(msg+1);
buffer.flip();
socketChannel.write(buffer);
//buffer.clear();
}
}
服务器,多线程
public class Server {
private static ExecutorService executorService = Executors.newFixedThreadPool(4);//指定线程数大小
public static void main(String[] args) {
try {
ServerSocketChannel server=ServerSocketChannel.open().bind(new InetSocketAddress(8881));
server.configureBlocking(false);
Selector selector=Selector.open();
server.register(selector,SelectionKey.OP_ACCEPT);
for(;;) {
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> iterator = keys.iterator();
while(iterator.hasNext()) {
SelectionKey next = iterator.next();
if(next.isAcceptable()) {
acceptHandle(next, selector);
}
if (next.isReadable()) {
executorService.submit(new Runnable() {//调用多线程,,这样子的话就是 accept 一个线程,read,write一个线程
@Override
public void run() {
// TODO Auto-generated method stub
try {
doRead(next, selector);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
iterator.remove();
}
Thread.sleep(2000);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void acceptHandle(SelectionKey key,Selector selector) throws IOException {
ServerSocketChannel serverShannel =(ServerSocketChannel) key.channel();
SocketChannel channel = serverShannel.accept();
channel.configureBlocking(false);
channel.register(selector, SelectionKey.OP_READ,ByteBuffer.allocate(1024));
}
public static void doRead(SelectionKey key,Selector selector) throws IOException {
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer buffer =(ByteBuffer) key.attachment();
buffer.clear();
int read = socketChannel.read(buffer);
int msg=buffer.getInt(0);
System.out.println(Thread.currentThread().getName()+" 服务器收到客户端"+socketChannel.getLocalAddress()+" "+msg);
buffer.rewind();
buffer.putInt(msg+1);
buffer.flip();
socketChannel.write(buffer);
//buffer.clear();
}
}
客户端
public class Client {
public static void main(String[] args) {
try(SocketChannel channel=SocketChannel.open();
Selector selector=Selector.open();
) {
channel.configureBlocking(false);
if(!channel.connect(new InetSocketAddress("127.0.0.1", 8881))) {
while(!channel.finishConnect()) {};
System.out.println("连接到服务器");
}
ByteBuffer buffer = ByteBuffer.allocate(1024);
buffer.putInt(1);
buffer.flip();
channel.write(buffer);
channel.register(selector, SelectionKey.OP_READ,buffer);
for(;;) {
selector.select();
Set<SelectionKey> keys = selector.selectedKeys();
Iterator<SelectionKey> iterator = keys.iterator();
while(iterator.hasNext()) {
SelectionKey next = iterator.next();
if(next.isReadable()) {
doRead(next,selector);
}
iterator.remove();
}
Thread.sleep(2000);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void doRead(SelectionKey key,Selector selector) throws IOException {
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer buffer =(ByteBuffer) key.attachment();
buffer.clear();
socketChannel.read(buffer);
int msg=buffer.getInt(0);
System.out.println("客户端收到服务器返回的信息"+socketChannel.getLocalAddress()+" "+msg);
buffer.putInt(0,msg+1);
buffer.flip();
socketChannel.write(buffer);
}
}
**ByteBuffer 是一个缓存区,用来保存用户要传输的数据,里面的读写方法是有一个 position ,limiet ,
capacity。
+ position类似一个指针,可以理解为记事本里的光标。代表了一个位置
+ limit是指针位置的最大限制,
+ capacity指的是容量 就是ByteBuffer的大小。
ByteBuffer 几个方法 clear(), flip(),rewind()等,都是对上面3个值进行操作。
而调用ChannelSocket的read() ,write()方法,传入一个ByteBuffer。都是根据传入的ByteBuffer里的3个值,进行读写。
例如:
```
ByteBuffer buf=new ByteBuffer(1024); //position=0,limit=1024,capacity=1024
buf.putInt(1);//在position为0的位置放入一个int,int为4字节,放完后。position=4;
channel.write(buf);//这里socket去传输这个buffer,这里也是从position=4的地方开始写的,一直写到limit。然后相当于没传数据
```
JAVA nio 简单使用的更多相关文章
- Java NIO简单介绍(二)
上一篇<NIO简单介绍(一)>中讲解了NIO中本地IO相关的内容,这篇重点介绍的NIO的非阻塞式网络通信 一.阻塞与非阻塞 传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read ...
- Java NIO简单介绍(一)
Java NIO( New IO) 是从Java 1.4版本开始引入的 一个新的IO API,可以替代标准的Java IO API. NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NI ...
- JAVA NIO 简单介绍
Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:00000099 EndFragment:00918492 一:为什么要使用NIO技术 ...
- 计算机网络(13)-----java nio手动实现简单的http服务器
java nio手动实现简单的http服务器 需求分析 最近在学习HTTP协议,还是希望动手去做一做,所以就自己实现了一个http服务器,主要功能是将http请求封装httpRequest,通过解析 ...
- 基于 Java NIO 实现简单的 HTTP 服务器
1.简介 本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理.本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Java NIO 实现了一个简单的 ...
- 简单即时通讯、聊天室--java NIO版本
实现的功能: 运行一个服务端,运行多个客户端.在客户端1,发送消息,其余客户端都能收到客户端1发送的消息. 重点: 1.ByteBuffer在使用时,注意flip()方法的调用,否则读取不到消息. 服 ...
- Java nio Client端简单示例
java nio是一种基于Channel.Selector.Buffer的技术,它是一种非阻塞的IO实现方式 以下Client端示例 public class ClientNio { public s ...
- 支撑Java NIO 与 NodeJS的底层技术
支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...
- JAVA NIO学习笔记1 - 架构简介
最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...
随机推荐
- SQL Server 内存优化表的索引设计
测试的版本:SQL Server 2017 内存优化表上可以创建哈希索引(Hash Index)和内存优化非聚集(NONCLUSTERED)索引,这两种类型的索引也是内存优化的,称作内存优化索引,和基 ...
- setInterval、setTimeout之遗忘的第三个参数
今天看阮一峰老师的ES6入门,在一个关于promise的小demo里,老师用到了setTimeout的第三个参数,惊了有没有,定时器还有第三个参数? 喏就是下面这个demo: function tim ...
- CentOS7 64位下MySQL安装与配置(YUM)
安装环境:腾讯云CentOS7 64位安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo/yum ...
- grep 命令使用
grep是Linux中最常用的"文本处理工具"之一,用于在文本中查找指定的字符串. 语法: grep [OPTION]... PATTERN [FILE]... 参数: -i:在搜 ...
- Python控制函数运行时间
在某个Flask项目在做后端接口时需要设置超时响应,因为接口中使用爬虫请求了多个网站,响应时间时长时短. 我需要设置一个最大响应时间,时间内如果接口爬虫没跑完,直接返回请求超时. 从网上了解到有两种方 ...
- MongoDB 学习笔记之 Aggregation Pipeline
Aggregation Pipeline: 常用操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip: ...
- UWP开发入门(二十四)—— Win10风格的打印对话框
虽然经常看到阿迪王发“看那个开发UWP的又上吊了”的图……还是忍不住重启一下这个系列.最近有用到UWP的print API,特地来写一篇给某软的这个伟大构想续一秒. 之前的打印对话框差不多长成这样: ...
- MacOS 安装MysqlDB 问题解决方案( 解决 IndexError: string index out of range)
pip install MySQL-python时报错如下: Command "python setup.py egg_info" failed with error code 1 ...
- C--二分搜索
//二分搜索 //时间复杂度小 log2 n int search(int key, int a[], int len) { ; ; ; int mid; while(left<right) { ...
- Vue中的循环以及修改差值表达式
0828自我总结 一.Vue中的循环 v-for 常见的4总情况 #第一种 <div v-for="item in items"></div> #第二种 & ...