JAVA NIO 基础学习
package com.hrd.netty.demo.jnio; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator; /**
* Created by hurd on 2016/1/26.
*/
public class NioServerListener extends Thread { protected Selector selector;
protected SocketChannel socketChannel; public NioServerListener(Selector selector){
this.selector = selector;
} @Override
public void run(){ try {
//while循环监听事件
while(true){
//阻塞
selector.select();
//获取选择器中已经就绪的SelectionKey集合
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
//遍历
while (iterator.hasNext()){
SelectionKey key = iterator.next();
//删除
iterator.remove();
//接受连接就绪事件
if(key.isAcceptable()){
ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
socketChannel = ssc.accept();
//套接字通道设置为非阻塞模式
socketChannel.configureBlocking(false);
//向socket通道 注册读就绪事件
socketChannel.register(selector, SelectionKey.OP_READ);
}else if(key.isReadable()){
//SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
int len = socketChannel.read(byteBuffer);
/*StringBuffer dataBuffer= new StringBuffer();
while( -1 != len){
//将写模式变为读模式
byteBuffer.flip();
CharBuffer charBuffer = byteBuffer.asCharBuffer();
dataBuffer.append(charBuffer.array());
byteBuffer.clear();
len = socketChannel.read(byteBuffer);
}*/
byteBuffer.flip();
//读取完毕
if(byteBuffer.limit()>0){
System.out.println("来自服务端消息:" + new String(byteBuffer.array()).trim());
}
}else if(key.isWritable()){
//暂时还没想明白这个写就绪事件干嘛用的。。。
System.out.println("暂不处理");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws IOException { //打开一个 ServerSocketChannel实例 并设置为false
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
//绑定ip +端口
serverSocketChannel.socket().bind(new InetSocketAddress("127.0.0.1",1024));
//打开一个选择器
Selector selector = Selector.open();
//向 serverSocketChannel 注册 接收就绪事件
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//开启线程进行监听
NioServerListener listener = new NioServerListener (selector);
listener.start();
//进行控制太输入 写事件 进行通讯
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while(true){
//java IO 阻塞读取数据
String data = bufferedReader.readLine();
if("exit".equals(data)){
if(null != listener.socketChannel){
listener.socketChannel.close();
}
System.out.println("主线程关闭.....");
System.exit(0);
}
ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
listener.socketChannel.write(buffer);
}
}
}
客户端 监听 package com.hrd.netty.demo.jnio; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.util.Iterator; /**
* Created by hurd on 2016/1/26.
*/
public class NioClientListener extends Thread { public Selector selector;
public SocketChannel socketChannel; public NioClientListener(Selector selector){
this.selector = selector;
} @Override
public void run(){ try {
//while循环监听事件
while(true){
//阻塞
selector.select();
//获取选择器中已经就绪的SelectionKey集合
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
//遍历
while (iterator.hasNext()){
SelectionKey key = iterator.next();
//删除
iterator.remove();
socketChannel = (SocketChannel) key.channel();
//套接字通道设置为非阻塞模式
socketChannel.configureBlocking(false); //连接就绪事件
if(key.isConnectable()){
socketChannel = (SocketChannel) key.channel();
//判断连接是否完成
int i =0;
while(! socketChannel.finishConnect()){
if(++i>10){
throw new RuntimeException("socket连接超时");
}
System.out.println("sock连接未完成,等待中....");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//向socket通道 注册读就绪事件
socketChannel.register(selector, SelectionKey.OP_READ);
}else if(key.isReadable()){
//SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(100);
int len = socketChannel.read(byteBuffer);
/*StringBuffer dataBuffer= new StringBuffer();
while( -1 != len){
//将写模式变为读模式
byteBuffer.flip();
CharBuffer charBuffer = byteBuffer.asCharBuffer();
dataBuffer.append(charBuffer.array());
byteBuffer.clear();
len = socketChannel.read(byteBuffer);
}*/
byteBuffer.flip();
//读取完毕
if(byteBuffer.limit()>0){
System.out.println("来自服务端消息:" + new String(byteBuffer.array()).trim());
}
}else if(key.isWritable()){
//暂时还没想明白这个写就绪事件干嘛用的。。。
System.out.println("暂不处理");
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws IOException { //打开一个SocketChannel实例 并设置为false
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false);
//绑定ip +端口
socketChannel.connect(new InetSocketAddress("127.0.0.1",1024));
//打开一个选择器
Selector selector = Selector.open();
//向 serverSocketChannel 注册 连接就绪事件
socketChannel.register(selector, SelectionKey.OP_CONNECT);
//开启线程进行监听
NioClientListener listener = new NioClientListener (selector);
listener.start();
//进行控制太输入 写事件 进行通讯
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while(true){
//java IO 阻塞读取数据
String data = bufferedReader.readLine();
if("exit".equals(data)){
socketChannel.close();
System.out.println("主线程关闭.....");
System.exit(0);
}
ByteBuffer buffer = ByteBuffer.wrap(data.getBytes());
socketChannel.write(buffer);
}
}
}
JAVA NIO 基础学习的更多相关文章
- Java【基础学习】之暴力求素数【用数组返回】
Java[基础学习]之暴力求素数[用数组返回] */ import java.util.*; public class Main{ public static void main(String[] a ...
- Java NIO 完全学习笔记(转)
本篇博客依照 Java NIO Tutorial翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java N ...
- NIO基础学习——缓冲区
NIO是对I/O处理的进一步抽象,包含了I/O的基础概念.我是基于网上博友的博客和Ron Hitchens写的<JAVA NIO>来学习的. NIO的三大核心内容:缓冲区,通道,选择器. ...
- Java NIO 核心组件学习笔记
背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ...
- Java NIO 基础知识
前言 前言部分是科普,读者可自行选择是否阅读这部分内容. 为什么我们需要关心 NIO?我想很多业务猿都会有这个疑问. 我在工作的前两年对这个问题也很不解,因为那个时候我认为自己已经非常熟悉 IO 操作 ...
- Java NIO 基础
Java在JDK1.4中引入了 java.nio 类库,为Java进军后端Server和中间件开发打开了方便之门. 一般而言,这里的 nio 代表的是 New I/O,但是从实质上来说,我们可以将其理 ...
- Mina入门:Java NIO基础概念
JDK1.4引入了Java NIO API(Java New IO),Java NIO得到了广泛应用.NIO允许程序进行非阻塞IO操作.java.nio.* 包括以下NIO基本结构: Buffer - ...
- 【原创】java NIO FileChannel 学习笔记 FileChannel 简介
java NIO 中FileChannel 的实现类是 FileChannelImpl,FileChannel本身是一个抽象类. 先介绍FileChannel File Channels 是线程安全 ...
- Java之基础学习(数据类型、运算符、分支语句和循环语句)
在工作用得比较多的是shell和python编程,对于java以前也学习过,使用很少,这次借朋友推荐的java视频教程来温习下. 也是因为现在很多开源测试工具使用java编写的,学习一下更有助于测试工 ...
随机推荐
- python血脉贲张的cosplay小姐姐图片
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 基本环境配置 python 3.6 pycharm requests 相关模块pip安装即可 ...
- Java 内存模型(Java Memory Model,JMM)
基本概念 JMM 本身是一种抽象的概念并不是真实存在,它描述的是一组规范,通过这组规范定义了程序的访问方式 JMM 同步规定 线程解锁前,必须把共享变量的值刷新回主内存 线程加锁前,必须读取主内存的最 ...
- Jaskson精讲第6篇-自定义JsonSerialize与Deserialize实现数据类型转换
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- Java中synchronized关键字理解
好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式 ...
- XXE漏洞介绍 & XXE漏洞攻击 & 修复建议
介绍XXE漏洞 XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是-种允许用户对自己的标记语 ...
- 基于SpringBoot+SpringDataJpa后台管理
昨天朋友找我喝酒,说30岁了,比较焦虑,钱没赚到,整天被媳妇数落. 其实现在我们看到的不一定就事真实的情况,就算从高斯分布看,平平淡淡的人生才是大部分人的轨迹.当然抖音.知乎上的不能比,人均收入百万, ...
- 关于C++的右值引用的一些看法
简介 关于C++中的右值引用的详细可以看这一批博文<从4行代码看右值引用>.那一篇博文详细结合四行简单的代码详细介绍了右值引用的使用方法和一些场景,非常实用. 而本篇博文主要介绍一下我在学 ...
- 074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现
074 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 06 综合案例-数组移位-主方法功能3的实现 本文知识点:综合案例-数组移位-主方法功能3的实现 说明:因为 ...
- python中numpy.savetxt 参数
转载:https://blog.csdn.net/qq_36535820/article/details/99543188 numpy.savetxt 参数 numpy.savetxt(fname,X ...
- JDBC Java 程序从 MySQL 数据库中读取数据,并备份到 xml 文档中
MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 相关内容:JDBC Java 程序从 MySQL 数据库中读取数据,并 ...