Netty权威指南-NIO实现TimeServer服务器端源代码
2016-01-23 18:17
381 查看
package com.jianweigang.NIO; 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; public class TimeServer { private static int DEFAULT_PORT = 8080; 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){ //如果没有传,那我们就使用默认的端口 port = DEFAULT_PORT; } } //创建一个多路复用器 MultiplexerTimeServer timeServer = new MultiplexerTimeServer(port); //单独启动一个线程 new Thread(timeServer, "NIO-MultiplexerTimerServer-001").start(); } } class MultiplexerTimeServer implements Runnable { private Selector selector; private ServerSocketChannel servChannel; private volatile boolean stop; 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_CONNECT); this.stop = false; 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; } public void run() { while(!stop) { try { //wait until 1000 millisecond selector.select(1000); Set<SelectionKey> selectionKeys = selector.selectedKeys(); Iterator<SelectionKey> it = selectionKeys.iterator(); SelectionKey key = null; while(it.hasNext()) { key = it.next(); try{ handleInput(key); }catch(Exception e) { } if(key != null) { key.cancel(); if(key.channel() != null) { key.channel().close(); } } } }catch(Exception e) { e.printStackTrace(); } } //多路复用器关闭以后,所有注册在上面的Channel和Pipe等资源都会自动去注册并关闭,所以不需要重复释放资源 if(selector != null) { try{ selector.close(); }catch(IOException e){ e.printStackTrace(); } } } //处理事件响应 private void handleInput(SelectionKey key) throws Exception { if(key.isValid()) { if(key.isAcceptable()) { ServerSocketChannel ssc = (ServerSocketChannel)key.channel(); SocketChannel sc = ssc.accept(); sc.configureBlocking(false); sc.register(selector, SelectionKey.OP_READ); } if(key.isReadable()) { SocketChannel sc = (SocketChannel)key.channel(); ByteBuffer readBuffer = ByteBuffer.allocate(1024); int readBytes = sc.read(readBuffer); if(readBytes > 0) { 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 response = "success get message at:" + new Date(System.currentTimeMillis()).toString(); doWrite(sc, response); } else { key.cancel(); sc.close(); } } } } //在成功接受客户端的请求消息以后,同时给客户端返回一条成功的信息 private void doWrite(SocketChannel sc, String response) throws Exception { if(response != null && response.length() > 0) { byte[] bytes = response.getBytes(); ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length); writeBuffer.put(bytes); writeBuffer.flip(); sc.write(writeBuffer); } } }
相关文章推荐
- Netty使用Http上传文件
- tomcat、netty以及nodejs的helloworld性能对比 3ff8
- Netty入门-client/server
- flatbuffers 和netty的结合使用
- netty 处理远程主机强制关闭一个连接
- Netty 源码分析(三):服务器端的初始化和注册过程
- 轻量级分布式 RPC 框架
- spark总体概况
- Netty系列之Netty百万级推送服务设计要点
- Netty初步
- Netty ChannelBuffer 简介
- netty4研究系列-序
- netty io.netty.channel 简介1
- spark overview
- Netty4和Netty5内存池的使用心得
- Netty与Reactor模式
- Netty源码分析之DelimiterBasedFrameDecoder
- Netty4学习笔记-001
- Netty4学习笔记-002
- Netty -- 内存管理