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 ...
随机推荐
- java数据结构——哈希表(HashTable)
哈希表提供了快速的插入操作和查找操作,每一个元素是一个key-value对,其基于数组来实现. 一.Java中HashMap与Hashtable的区别: HashMap可以接受null键值和值,而Ha ...
- jquery让form表单异步提交
1.监听表单提交事件,并阻止表单提交 $("form").submit(function(e) { return false;//阻止表单提交 }) 2.拿到表单内容 let da ...
- Java基础系列-深入理解==和equals的区别(一)
一.前言 说到==和equals的问题,面试的时候可能经常被问题到,有时候如果你真的没有搞清楚里边的原因,被面试官一顿绕就懵了,所以今天我们也来彻底了解一下这个知识点. 二.==和equals的作用 ...
- 搭建大数据开发环境-Hadoop篇
前期准备 操作系统 hadoop目前对linux操作系统支持是最好的,可以部署2000个节点的服务器集群:在hadoop2.2以后,开始支持windows操作系统,但是兼容性没有linux好.因此,建 ...
- Android Studio [RecyclerView/瀑布流显示]
PuRecyclerViewActivity.java package com.xdw.a122.recyclerview; import android.support.v7.app.AppComp ...
- 深度学习论文翻译解析(五):Siamese Neural Networks for One-shot Image Recognition
论文标题:Siamese Neural Networks for One-shot Image Recognition 论文作者: Gregory Koch Richard Zemel Rusla ...
- 使用JSP+Servlet+Jdbc+Echatrs实现对豆瓣电影Top250的展示
使用JSP+Servlet+Jdbc+Echatrs实现对豆瓣电影Top250的展示 写在前面: 有的小伙伴,会吐槽啦,你这个标题有点长的啊.哈哈 ,好像是的!不过,这个也是本次案例中使用到的关键技术 ...
- CDH集群的配置优化须知
通过改善IFile阅读器的性能 IFile Reader,进而可改善随机处理程序并减少储备空间,达到MapReduce的配置最佳实践要求.而MapReduce shuffle的处理程序和 ...
- opencv边缘检测-拉普拉斯算子
sobel算子一文说了,索贝尔算子是模拟一阶求导,导数越大的地方说明变换越剧烈,越有可能是边缘. 那如果继续对f'(t)求导呢? 可以发现"边缘处"的二阶导数=0. 我们可以利用这 ...
- json入门初体验
json是JavaScript对象表示法,也是轻量级的文本数据交互格式,独立于语言,能够自我描述 json文本格式在语法上与创建JavaScript对象代码相同,多以json不需要解析器,js程序能够 ...