博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络编程 -- RPC实现原理 -- NIO单线程
阅读量:5300 次
发布时间:2019-06-14

本文共 6160 字,大约阅读时间需要 20 分钟。

  

啦啦啦

  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
selectedKeys = selector.selectedKeys(); Iterator
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 2017Thread[Thread-0,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017Thread[Thread-3,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017Thread[Thread-9,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017Thread[Thread-1,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017Thread[Thread-4,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017Thread[Thread-6,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017Thread[Thread-5,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017Thread[Thread-8,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017Thread[Thread-2,5,main] 服务端响应 : Sat Jun 24 16:00:41 CST 2017

 

啦啦啦

转载于:https://www.cnblogs.com/ClassNotFoundException/p/7073484.html

你可能感兴趣的文章
使用Scrapy爬虫框架简单爬取图片并保存本地(妹子图)
查看>>
7.5 文件操作
查看>>
DFS-hdu-2821-Pusher
查看>>
吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:地址(Address)
查看>>
吴裕雄--天生自然 JAVASCRIPT开发学习: 表单
查看>>
UITextField
查看>>
Spring事务管理的三种方式
查看>>
MyEclipse中将普通Java项目convert(转化)为Maven项目
查看>>
node js 安装.node-gyp/8.9.4 权限 无法访问
查看>>
Java_正则表达式
查看>>
Linux内核分析——第二周学习笔记
查看>>
windows基本命令
查看>>
Qt图片显示效率的比较(转)
查看>>
VMware中CentOS设置静态IP
查看>>
剑指Offer_编程题_7
查看>>
js 变量大小写
查看>>
Linux系统的启动原理
查看>>
JDesktopPane JInternalFrames
查看>>
错误The request sent by the client was syntactically incorrect ()的解决
查看>>
Java基础知识学习(九)
查看>>