NIO概述及实例(时钟服务器)
NIO,非阻塞IO,重点是非阻塞而不是异步!
NIO的一般实现如下:
package com.pt.nio; 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.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Set; /**
* @author panteng
* @description 时钟服务器
* @date 17-3-10.
*/
public class NioServer {
public static void main(String[] arges) throws Exception {
char name = 'A';
// 创建通道,并设置非阻塞
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
// 创建选择器,并为通道绑定感兴趣的事件
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT).attach("主监听通道");
System.out.println("监听的channel Id:" + serverSocketChannel.hashCode());
// 通道绑定端口号
InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 4700);
serverSocketChannel.socket().bind(inetSocketAddress);
// 开始轮询通道事件
while (true) {
// 可以是阻塞,非阻塞,也可以设置超时
int readyChannels = selector.selectNow();
if (readyChannels > 0) {
Set<SelectionKey> readyKeys = selector.selectedKeys();
Iterator iterator = readyKeys.iterator();
while (iterator.hasNext()) {
SelectionKey readyKey = (SelectionKey) iterator.next();
iterator.remove();
if (readyKey.isAcceptable()) {
ServerSocketChannel readyChannel = (ServerSocketChannel) readyKey.channel();
System.out.println("可接受连接的channel Id:" + readyChannel.hashCode() + readyKey.attachment());
SocketChannel socketChannel1 = (SocketChannel) readyChannel.accept().configureBlocking(false);
System.out.println("接受连接后返回的channel Id" + socketChannel1.hashCode());
socketChannel1.register(selector, (SelectionKey.OP_READ | SelectionKey.OP_WRITE)).attach(name);
name++;
} if (readyKey.isWritable()) {
SocketChannel readyChannel = (SocketChannel) readyKey.channel();
ByteBuffer buffer = ByteBuffer.allocate(512);
buffer.put(("to " + readyKey.attachment() + " " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "\n")
.getBytes());
buffer.flip();
readyChannel.write(buffer);
} if (readyKey.isReadable()) {
SocketChannel readyChannel = (SocketChannel) readyKey.channel();
ByteBuffer buffer = ByteBuffer.allocate(512);
readyChannel.read(buffer);
System.out.println(readyKey.attachment() + " " + getString(buffer));
}
}
}
Thread.sleep(1000);
}
} /**
* ByteBuffer 转换 String
*
* @param buffer
* @return
*/
public static String getString(ByteBuffer buffer) {
String string = "";
try {
for (int i = 0; i < buffer.position(); i++) {
string += (char) buffer.get(i);
}
return string;
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}
}
此服务器有一个监听通道,时刻监听是否有客户端连接;如果有,则在accept()的时候,返回一个新通道,作为一个连接!
NIO概述及实例(时钟服务器)的更多相关文章
- Java NIO学习笔记一 Java NIO概述
Java NIO概述 Java NIO(新的IO)是Java的替代IO API(来自Java 1.4),这意味着替代标准的 java IO和java Networking API.Java NIO提供 ...
- 网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器
网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器 网络时钟服务器,NTP授时设备,北斗网络校时服务器,GPS时间同步器 论述当下网络时间同步的重要性 北京华人开创科技发展有限公 ...
- Java NIO系列教程(一) Java NIO 概述
<I/O模型之四:Java 浅析I/O模型> 一.阻塞IO与非阻塞IO 阻塞IO: 通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据.同样,写入调用将会阻塞直至数 ...
- RHEL7 -- 使用Chrony设置时间与时钟服务器同步
Chrony是一个开源的自由软件,它能保持系统时钟与时钟服务器(NTP)同步,让时间保持精确. 它由两个程序组成:chronyd和chronyc. chronyd是一个后台运行的守护进程,用于调整内核 ...
- ntp时钟服务器
NTP服务器时钟校准的基本流程: (1):NTP客户端向NTP服务器发出一个时间请求包(UDP包),其中包含了该包离开客户端时的时间戳. (2):当服务器接收到该包时.填入包到达时的时间戳.包离开时的 ...
- Java NIO:NIO概述
Java NIO:NIO概述 在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题.NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题.本文下面分别从Java ...
- (转载)Java NIO:NIO概述(一)
Java NIO:NIO概述 在上一篇博文中讲述了几种IO模型,现在我们开始进入Java NIO编程主题.NIO是Java 4里面提供的新的API,目的是用来解决传统IO的问题.本文下面分别从Java ...
- oracle实例,数据库,服务器区别
实例(instance) 实例是一个非固定的,基于内存的基本进程与内存结构.当服务器关闭时,实例就不存在了. 数据库(DataBase) 数据库指固定的,基于磁盘的数据文件,控制文件,日志文件,参数文 ...
- 北斗卫星同步时钟(NTP网络时钟服务器)成功投运世界级工程港珠澳大桥
北斗卫星同步时钟(NTP网络时钟服务器)成功投运世界级工程港珠澳大桥 北斗卫星同步时钟(NTP网络时钟服务器)成功投运世界级工程港珠澳大桥 本文由北京华人开创科技公司提供 原址在 http://www ...
随机推荐
- 数据一致性和io类型
版权声明:本文由高剑林原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/106 来源:腾云阁 https://www.qclo ...
- 使用FileZilla向linux系统上传文件
- DG快照备库
1.使用快照先决条件:主备库开启闪回功能 2.把备库转为快照库 DGMGRL> convert database satest to SNAPSHOT STANDBY; Converting d ...
- 微信小程序 --- 设置页面的标题
第一种方式:修改 page.json文件 { "navigationBarTitleText": "豆瓣 - 电影" } 第二种方式:使用 JS 修改: wx. ...
- MUI事件管理
模块:事件管理 http://dev.dcloud.net.cn/mui/event/ 事件绑定: 除了可以使用addEventListener()方法监听某个特定元素上的事件外, 也可以使用.on( ...
- 几何+线段交点+spfa(POJ1066)
Treasure Hunt Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) Total ...
- PreparedStatement vs Statement
Statement和PreparedStatement之间的区别 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 2.使用 Statemen ...
- Yii2 高级模板不使用Apache配置目录,将前后台入口移到根目录
刚刚入手Yii2高级模板不久,部署项目时,得部署2个应用,个人感觉很繁琐,就将前后台入口文件全部拿到项目根目录.但是一看,完了,出错了!找教程找不到,还是自己解决吧 为了以后好升级,不改变Yii2核心 ...
- SQL Server经典函数之数字去零
需求: 针对带有小数点的数字信息,去除小数点后多余的零 可能存在的情况: 1.精度范围内,出现多余的零 eg:1234.3400 想要的结果为1234.34 2.精度变大出现的多余的零, ...
- CodeForces 19B Checkout Assistant
B. Checkout Assistant time limit per test 1 second memory limit per test 256 megabytes input standar ...