博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java NIO记录
阅读量:7081 次
发布时间:2019-06-28

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

hot3.png

public class TimeServer {    /**     * @param args     * @throws IOException     */    public static void main(String[] args) throws IOException {	int port = 8080;	if (args != null && args.length > 0) {	    try {		port = Integer.valueOf(args[0]);	    } catch (NumberFormatException e) {		// 采用默认值	    }	}	MultiplexerTimeServer timeServer = new MultiplexerTimeServer(port);	new Thread(timeServer, "NIO-MultiplexerTimeServer-001").start();    }}
public class MultiplexerTimeServer implements Runnable {    private Selector selector;    private ServerSocketChannel servChannel;    private volatile boolean stop;    /**     * 初始化多路复用器、绑定监听端口     *      * @param port     */    public MultiplexerTimeServer(int port) {	try {	    selector = Selector.open();	    servChannel = ServerSocketChannel.open();	    servChannel.configureBlocking(false);	    servChannel.socket().bind(new InetSocketAddress(port), 1024);	    servChannel.register(selector, SelectionKey.OP_ACCEPT);	    System.out.println("The time server is start in port : " + port);	} catch (IOException e) {	    e.printStackTrace();	    System.exit(1);	}    }    public void stop() {	this.stop = true;    }    /*     * (non-Javadoc)     *      * @see java.lang.Runnable#run()     */    @Override    public void run() {	while (!stop) {	    try {		selector.select(1000);		Set
 selectedKeys = selector.selectedKeys(); Iterator
 it = selectedKeys.iterator(); SelectionKey key = null; while (it.hasNext()) {     key = it.next();     it.remove();     try { handleInput(key);     } catch (Exception e) { if (key != null) {     key.cancel();     if (key.channel() != null) key.channel().close(); }     } }     } catch (Throwable t) { t.printStackTrace();     } } // 多路复用器关闭后,所有注册在上面的Channel和Pipe等资源都会被自动去注册并关闭,所以不需要重复释放资源 if (selector != null)     try { selector.close();     } catch (IOException e) { e.printStackTrace();     }    }    private void handleInput(SelectionKey key) throws IOException { if (key.isValid()) {     // 处理新接入的请求消息     if (key.isAcceptable()) { // Accept the new connection ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); SocketChannel sc = ssc.accept(); sc.configureBlocking(false); // Add the new connection to the selector sc.register(selector, SelectionKey.OP_READ);     }     if (key.isReadable()) { // Read the data SocketChannel sc = (SocketChannel) key.channel(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); int readBytes = sc.read(readBuffer); if (readBytes > 0) {     readBuffer.flip();     byte[] bytes = new byte[readBuffer.remaining()];     readBuffer.get(bytes);     String body = new String(bytes, "UTF-8");     System.out.println("The time server receive order : "     + body);     String currentTime = "QUERY TIME ORDER"     .equalsIgnoreCase(body) ? new java.util.Date(     System.currentTimeMillis()).toString()     : "BAD ORDER";     doWrite(sc, currentTime); } else if (readBytes < 0) {     // 对端链路关闭     key.cancel();     sc.close(); } else     ; // 读到0字节,忽略     } }    }    private void doWrite(SocketChannel channel, String response)     throws IOException { if (response != null && response.trim().length() > 0) {     byte[] bytes = response.getBytes();     ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length);     writeBuffer.put(bytes);     writeBuffer.flip();     channel.write(writeBuffer); }    }}
public class TimeClient {    /**     * @param args     */    public static void main(String[] args) {	int port = 8080;	if (args != null && args.length > 0) {	    try {		port = Integer.valueOf(args[0]);	    } catch (NumberFormatException e) {		// 采用默认值	    }	}	new Thread(new TimeClientHandle("127.0.0.1", port), "TimeClient-001")		.start();    }}
public class TimeClientHandle implements Runnable {    private String host;    private int port;    private Selector selector;    private SocketChannel socketChannel;    private volatile boolean stop;    public TimeClientHandle(String host, int port) {	this.host = host == null ? "127.0.0.1" : host;	this.port = port;	try {	    selector = Selector.open();	    socketChannel = SocketChannel.open();	    socketChannel.configureBlocking(false);	} catch (IOException e) {	    e.printStackTrace();	    System.exit(1);	}    }    /*     * (non-Javadoc)     *      * @see java.lang.Runnable#run()     */    @Override    public void run() {	try {	    doConnect();	} catch (IOException e) {	    e.printStackTrace();	    System.exit(1);	}	while (!stop) {	    try {		selector.select(1000);		Set
 selectedKeys = selector.selectedKeys(); Iterator
 it = selectedKeys.iterator(); SelectionKey key = null; while (it.hasNext()) {     key = it.next();     it.remove();     try { handleInput(key);     } catch (Exception e) { if (key != null) {     key.cancel();     if (key.channel() != null) key.channel().close(); }     } }     } catch (Exception e) { e.printStackTrace(); System.exit(1);     } } // 多路复用器关闭后,所有注册在上面的Channel和Pipe等资源都会被自动去注册并关闭,所以不需要重复释放资源 if (selector != null)     try { selector.close();     } catch (IOException e) { e.printStackTrace();     }    }    private void handleInput(SelectionKey key) throws IOException { if (key.isValid()) {     // 判断是否连接成功     SocketChannel sc = (SocketChannel) key.channel();     if (key.isConnectable()) { if (sc.finishConnect()) {     sc.register(selector, SelectionKey.OP_READ);     doWrite(sc); } else     System.exit(1);// 连接失败,进程退出     }     if (key.isReadable()) { ByteBuffer readBuffer = ByteBuffer.allocate(1024); int readBytes = sc.read(readBuffer); if (readBytes > 0) {     readBuffer.flip();     byte[] bytes = new byte[readBuffer.remaining()];     readBuffer.get(bytes);     String body = new String(bytes, "UTF-8");     System.out.println("Now is : " + body);     this.stop = true; } else if (readBytes < 0) {     // 对端链路关闭     key.cancel();     sc.close(); } else     ; // 读到0字节,忽略     } }    }    private void doConnect() throws IOException { // 如果直接连接成功,则注册到多路复用器上,发送请求消息,读应答 if (socketChannel.connect(new InetSocketAddress(host, port))) {     socketChannel.register(selector, SelectionKey.OP_READ);     doWrite(socketChannel); } else     socketChannel.register(selector, SelectionKey.OP_CONNECT);    }    private void doWrite(SocketChannel sc) throws IOException { byte[] req = "QUERY TIME ORDER".getBytes(); ByteBuffer writeBuffer = ByteBuffer.allocate(req.length); writeBuffer.put(req); writeBuffer.flip(); sc.write(writeBuffer); if (!writeBuffer.hasRemaining())     System.out.println("Send order 2 server succeed.");    }}

转载于:https://my.oschina.net/u/572362/blog/538154

你可能感兴趣的文章
微服务实战(六):选择微服务部署策略
查看>>
mybatis入门教程(二)
查看>>
Java NIO(一)
查看>>
npm 更新模块
查看>>
Docker介绍
查看>>
MYSQL之SQL高级运用(帮助你高效率编程)
查看>>
Silverlight+WCF 新手实例 象棋 棋子移动-吃子(五)
查看>>
利用for循环插入多条数据
查看>>
阿里云maven库地址 和maven跳过测试 和常见maven命令
查看>>
Android网络防火墙实现初探
查看>>
欲保长寿,先补亏损 —胡海牙
查看>>
数据容量进制转换
查看>>
Spring Cloud Zuul过滤器详解
查看>>
使用DOM4J创建一个新的XML文件
查看>>
VIM使用系列:搜索功能
查看>>
SOAP--------Golang对接WebService服务实战
查看>>
7大维度看国外企业为啥选择gRPC打造高性能微服务?
查看>>
初创公司电商系统建立思考
查看>>
微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务
查看>>
zipfile
查看>>