Java nio Server端示例
public class ServerNio {
public static void main(String[] args) throws IOException, InterruptedException {
//打开一个selector
Selector selector = Selector.open();
//打开serverSock通道
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//非阻塞模式
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(new InetSocketAddress(8099)); // bind address on port
//向selector注册一个接受客户端事件,如果有客户端想和8099端口建立连接,selector会生成接受连接就绪事件
SelectionKey selectionKey = serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT, 1);
try {
while (true) {
System.out.println("in while(true)");
//select 注册的key whose channels are ready for I/O operations
int count = selector.select();
System.out.println("select count:" + count);
//在无限循环中,就绪事件个数大于0时,进入逻辑处理流程
if (count > 0) {
//获取就绪事件key
Set<SelectionKey> selectionKeySet = selector.selectedKeys();
Iterator<SelectionKey> selectionKeyIterator = selectionKeySet.iterator();
//遍历就绪的selectionKey
while ((selectionKeyIterator.hasNext())) {
SelectionKey key = selectionKeyIterator.next();
//先remove掉,防止重复处理
selectionKeyIterator.remove();
//如果key是建立连接请求
if (key.isAcceptable()) {
System.out.println("attachment:" + key.attachment());
ServerSocketChannel channel = (ServerSocketChannel) key.channel();
//如果不处理,那么每次都能select到它,接受请求
SocketChannel socketChannel = channel.accept();
socketChannel.configureBlocking(false);
System.out.println("has accept channel");
// socketChannel.socket().setSoTimeout(2000);
//项selector注册读监控事件,可以考虑注册到另一个selector上去,让当前selector只处理accept
socketChannel.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel sc = (SocketChannel) key.channel();
if (!sc.isOpen()) {
System.out.println("in continue");
continue;
}
//开辟4个byte空间
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.clear();
//从sc中读取byte到buffer中
int bytesRead = sc.read(byteBuffer);
//断开连接了,-1就是socket关闭的意思
if (bytesRead == -1) {
sc.close();
System.out.println("client is out");
continue;
}
System.out.println("读取的byte个数:" + bytesRead);
if (bytesRead > 0) {
//切换为读模式
byteBuffer.flip();
//由于传输的是一个int,这里尝试将4个byte转回int
int value = 0;
value = value | ((byteBuffer.get(0) & 0xFF) << 24);
value = value | ((byteBuffer.get(1) & 0xFF) << 16);
value = value | ((byteBuffer.get(2) & 0xFF) << 8);
value = value | ((byteBuffer.get(3) & 0xff));
//读取到的值
System.out.println("transport value:int:" + value);
}
// sc.register(selector, SelectionKey.OP_WRITE);
} else if (key.isWritable()) {
//类似response
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.clear();
byteBuffer.putInt(3);
sc.write(byteBuffer);
// sc.register(selector, SelectionKey.OP_READ);
}
}
System.out.println("selectionKeySize:" + selectionKeySet.size());
}
Thread.sleep(100);
}
} finally {
Thread.sleep(20000);
selector.close();
}
}
}
Java nio Server端示例的更多相关文章
- Java nio Client端简单示例
java nio是一种基于Channel.Selector.Buffer的技术,它是一种非阻塞的IO实现方式 以下Client端示例 public class ClientNio { public s ...
- java nio socket使用示例
这个示例,实现一个简单的C/S,客户端向服务器端发送消息,服务器将收到的消息打印到控制台,并将该消息返回给客户端,客户端再打印到控制台.现实的应用中需要定义发送数据使用的协议,以帮助服务器解析消息.本 ...
- 一段关于java NIO server端接受客户端socket连接;演示了关于channel,selector等组件的整合使用
public class ReactorDemo { public static void main(String[] args) throws IOException { ServerSocketC ...
- Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)
1.Java NIO 由以下几个核心部分组成: Channels(通道) Buffers(缓冲区) Selectors(选择器) 虽然Java NIO 中除此之外还有很多类和组件,Channel,Bu ...
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- 从I/O多路复用到Netty,还要跨过Java NIO包
本文是Netty系列第4篇 上一篇文章我们深入了解了I/O多路复用的三种实现形式,select/poll/epoll. 那Netty是使用哪种实现的I/O多路复用呢?这个问题,得从Java NIO包说 ...
- [JavaEE]Java NIO原理图文分析及代码实现
转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO ...
- Java NIO原理图文分析及代码实现
原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java ...
- Java NIO原理 图文分析及代码实现
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请 ...
随机推荐
- Mac使用Charles给iPhone抓包流程
目录 需求 步骤 1. Mac打开共享Wifi 2. iPhone连接刚刚的WIFI 3. 找到Mac的局域网ip 4. 配置代理 需求 有时候手机接口出问题了,不知道从哪里下手,Charles就是非 ...
- jdk环境配置(Windows)
电脑>属性>高级系统设置>环境变量 1 创建JAVA_HOME,值是你的刚刚jdk的安装目录,比如 C:\Program Files (x86)\Java\jdk1.8.0_101 ...
- 在移动硬盘上安装Linux Mint19记录
前要: 有一12年买的手提电脑,打算在其上直接装linux部署分布式爬虫顺便学linux 唔,开机吧--然开机动画没有,只有间断有序的悲鸣,一查,主板逝世 卖给收买旧电脑估计不到20-不能忍,想了想不 ...
- 生命周期(初始化、销毁方法、BeanPostProcessor后处理Bean)
1.初始化和销毁 在目标方法执行前后进行初始化或销毁 (1)在Service方法的实现类里面创建初始化方法和销毁方法: public class StudentServiceImpl implemen ...
- 【译】使用 WebView2 将最好的 Web 带到 .NET 桌面应用程序中
在去年的 Build 大会上,我们引入了 WebView2,这是一个浏览器控件,可以用新的基于 Chrome 的 Microsoft Edge 来呈现 Web 内容(HTML / CSS / Java ...
- RabbitMq如何确保消息不丢失
上篇写了掌握Rabbitmq几个重要概念,从一条消息说起,这篇来总结关于消息丢失让人头痛的事情.网络故障.服务器重启.硬盘损坏等都会导致消息的丢失.消息从生产到消费主要结果以下几个阶段如下图. ①生产 ...
- 星涛:采用java递归复制文件夹
package com.botao; import java.io.*; /** * @author cbt28 */ public class FileUtil { public static St ...
- 我把这个贼好用的Excel导出工具开源了!!
写在前面 不管是传统软件企业还是互联网企业,不管是管理软件还是面向C端的互联网应用.都不可避免的会涉及到报表操作,而对于报表业务来说,一个很重要的功能就是将数据导出到Excel.如果我们在业务代码中, ...
- hosts文件的内容
C:\Windows\System32\drivers\etc\hosts 1 # Copyright (c) 1993-2009 Microsoft Corp. 2 # 3 # This is a ...
- 【题解】CF1375D Replace by MEX
\(\color{purple}{Link}\) \(\text{Solution:}\) 观察到题目要求操作次数不超过\(2n,\)且不必最小化操作次数,所以一定是构造题. 考虑将序列转化为\([0 ...