网络编程 -- RPC实现原理 -- NIO单线程
啦啦啦
Class : Service
package lime.pri.limeNio.optimize.socket; import java.io.ByteArrayOutputStream;
import java.io.IOException;
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.Date;
import java.util.Iterator;
import java.util.Set; /**
* 单线程NIO
*
* @author lime
*
*/
public class Service { public static void main(String[] args) throws IOException {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);
Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
System.out.println("监听端口@9999,等待客户端连接...");
int n = selector.select();
System.out.println("事件就绪通道个数 : " + n);
Set<SelectionKey> selectedKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectedKeys.iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
iterator.remove();
if (selectionKey.isAcceptable()) {
System.out.println("-- -- -- 处理Acceptable事件");
ServerSocketChannel ssc = (ServerSocketChannel) selectionKey.channel();
SocketChannel sc = ssc.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
} else if (selectionKey.isReadable()) {
System.out.println("-- -- -- 处理Readable事件");
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
byteBuffer.clear();
SocketChannel sc = (SocketChannel) selectionKey.channel();
sc.read(byteBuffer);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bos.write(byteBuffer.array());
System.out.println("客户端( " + sc.getRemoteAddress() + " ) 请求 : " + bos.toString());
sc.register(selector, SelectionKey.OP_WRITE);
} else if (selectionKey.isWritable()) {
System.out.println("-- -- -- 处理Writable事件");
String response = "服务端响应 : " + new Date().toString();
ByteBuffer byteBuffer = ByteBuffer.wrap(response.getBytes());
SocketChannel sc = (SocketChannel) selectionKey.channel();
sc.write(byteBuffer);
sc.close();
}
}
}
}
}
Class : Client
package lime.pri.limeNio.optimize.socket; import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel; public class Client { public static void main(String[] args) throws IOException {
for (int i = 0; i < 10; i++) {
new Thread() {
{
setDaemon(false);
} public void run() {
try {
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("127.0.0.1", 9999)); socketChannel.write(ByteBuffer.wrap("Query Date".getBytes()));
socketChannel.shutdownOutput();
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
socketChannel.read(byteBuffer);
System.out.println(new String(byteBuffer.array()));
socketChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}
}
}
Console : Server
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 1
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 1
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2689 ) 请求 : Query Date
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 1
-- -- -- 处理Writable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 1
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 2
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2690 ) 请求 : Query Date
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 3
-- -- -- 处理Writable事件
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2691 ) 请求 : Query Date
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 3
-- -- -- 处理Writable事件
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2692 ) 请求 : Query Date
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 3
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2693 ) 请求 : Query Date
-- -- -- 处理Writable事件
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 3
-- -- -- 处理Writable事件
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2694 ) 请求 : Query Date
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 3
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2695 ) 请求 : Query Date
-- -- -- 处理Writable事件
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 3
-- -- -- 处理Writable事件
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2696 ) 请求 : Query Date
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 3
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2697 ) 请求 : Query Date
-- -- -- 处理Writable事件
-- -- -- 处理Acceptable事件
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 2
-- -- -- 处理Writable事件
-- -- -- 处理Readable事件
客户端( /127.0.0.1:2698 ) 请求 : Query Date
监听端口@9999,等待客户端连接...
事件就绪通道个数 : 1
-- -- -- 处理Writable事件
监听端口@9999,等待客户端连接...
Console : Client
Thread[Thread-7,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-0,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-3,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-9,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-1,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-4,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-6,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-5,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-8,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
Thread[Thread-2,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017
啦啦啦
网络编程 -- RPC实现原理 -- NIO单线程的更多相关文章
- 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——设置标识变量selectionKey.attach(true);只处理一次(会一直循环遍历selectionKeys,占用CPU资源). ( ...
- 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V2
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——增加WriteQueue队列,存放selectionKey.addWriteEventToQueue()添加selectionKey并唤醒阻 ...
- 网络编程 -- RPC实现原理 -- 目录
-- 啦啦啦 -- 网络编程 -- RPC实现原理 -- NIO单线程 网络编程 -- RPC实现原理 -- NIO多线程 -- 迭代版本V1 网络编程 -- RPC实现原理 -- NIO多线程 -- ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V1 -- 入门应用
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V1——Netty入门应用 Class : NIOServerBootStrap package lime.pri.limeNio.netty.ne ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V2 -- 对象传输
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- 使用序列化和反序列化在网络上传输对象:需要实现 java.io.Serializable 接口 只能传输( ByteBuf ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V3 -- 编码解码
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- pipeline.addLast(io.netty.handler.codec.MessageToMessageCodec ...
- 网络编程 -- RPC实现原理 -- Netty -- 迭代版本V4 -- 粘包拆包
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V2——Netty -- new LengthFieldPrepender(2) : 设置数据包 2 字节的特征码 new LengthFieldB ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V3 -- 远程方法调用 整合 Spring
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V3——RPC -- 远程方法调用 及 null的传输 + Spring 服务提供商: 1. 配置 rpc03_server.xml 注入 服务提供 ...
- 网络编程 -- RPC实现原理 -- RPC -- 迭代版本V4 -- 远程方法调用 整合 Spring 自动注册
网络编程 -- RPC实现原理 -- 目录 啦啦啦 V4——RPC -- 远程方法调用 + Spring 自动注册 服务提供商: 1. 配置 rpc04_server.xml 注入 服务提供商 rpc ...
随机推荐
- 轻松学C#----第二篇笔记
第二篇: 分析下第一篇的代码,见下图: 2.同其他语言一样,C#语言在编写时也遵守一定的语法规范. A.标识符(identify):指为方法.变量.其他任何用户自定义项指定的名称.标识符必须遵循一定的 ...
- unity无限循环报错的定位
晚上遇到了,碰到了程序一运行就卡住的尴尬问题,然后百度下,看了看,Get到了一个新的skill. 1. 打开对应的VS程序,选择“调试/Attach Unity Debuger”菜单来调试代码. 2. ...
- java计算今天是今年的第几天
Calendar.getInstance().get(Calendar.DAY_OF_YEAR)
- 什么是less?
什么是less? 简单的说,你可以在你的css文件中使用变量.函数等方式来编写你的css. less具有哪些功能? 混入(Mixins)——class中的class: 参数混入——可以传递参数的cla ...
- [Beego模型] 四、使用SQL语句进行查询
[Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...
- 学习shader之前必须知道的东西之计算机图形学-渲染管线
引言 shader到底是干什么用的?shader的工作原理是什么? 其实当我们对这个问题还很懵懂的时候,就已经开始急不可耐的要四处搜寻有关shader的资料,恨不得立刻上手写一个出来.但看了一些资料甚 ...
- Window 任务栏清除历史记录
Window任务栏上的历史记录在很多情况下是很方便的[可以很快速的执行命令] 但如果历史记录太多可能会影响使用,经过我N长时间的研究和网络上的搜索 终于找到了清除的方法,网络上通过IE删除等方式都是无 ...
- textAngular字体依赖
textAngular部分按钮显示不正常, 对比后发现是少了字体css <link href="https://cdn.bootcss.com/font-awesome/4.7.0/c ...
- FeignClient使用
在使用Spring Cloud开发微服务应用时中,各个微服务服务提供者都是以HTTP接口的形式对外提供服务,因此服务消费者在调用服务提供者时,通过HTTP Client的方式访问.当然我们可以使用JD ...
- [Aaronyang] 写给自己的WPF4.5 笔记13[二维自定义控件技巧-可视化状态实战,自定义容器,注册类命令,用户控件补充]
我的文章一定要做到对读者负责,否则就是失败的文章 --------- www.ayjs.net aaronyang技术分享 博文摘要:欢迎大家来支持我的<2013-2015 Aar ...