一个基于AIO实现的简单web服务器
时间:2014-05-08 04:48:53
收藏:0
阅读:341
一下是一个基于AIO实现的简单web服务器,这是一个简单例子
/** * 一个简单的web 服务器<br/> * 通过浏览器输入localhost:8080/访问 * * @author Joeson * @since 2014/05 * */ public class AioServer implements Runnable { private AsynchronousChannelGroup asyncChannelGroup; private AsynchronousServerSocketChannel server; public AioServer(int port) throws Exception { // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(20); // 异步通道管理器 asyncChannelGroup = AsynchronousChannelGroup.withThreadPool(executor); // 创建 用在服务端的异步Socket.以下简称服务器socket。 // 异步通道管理器,会把服务端所用到的相关参数 server = AsynchronousServerSocketChannel.open(asyncChannelGroup).bind( new InetSocketAddress(port)); } public void run() { try { // 为服务端socket指定接收操作对象.accept原型是: // accept(A attachment, CompletionHandler<AsynchronousSocketChannel, // ? super A> handler) // 也就是这里的CompletionHandler的A型参数是实际调用accept方法的第一个参数 // 即是listener。另一个参数V,就是原型中的客户端socket server.accept( server, new CompletionHandler<AsynchronousSocketChannel, AsynchronousServerSocketChannel>() { String CRLF = "\r\n"; // 响应头的参数 String serverLine = "Server:a simple java WebServer"; String statusLine = "HTTP/1.1 200 OK" + CRLF; String contentTypeLine = "Content-type:text/html" + CRLF; String contentLengthLine = "Content-Length:" + 300 + CRLF; String str = "<html><head><title>test</title></head><body><p>this is a socketserver test</p></body></html>"; @Override public void completed(AsynchronousSocketChannel result, AsynchronousServerSocketChannel attachment) { // TODO Auto-generated method stub // writeChannel(result, statusLine); // writeChannel(result, serverLine); // writeChannel(result, contentTypeLine); // writeChannel(result, contentLengthLine); // writeChannel(result, CRLF); writeChannel(result, statusLine + serverLine + contentTypeLine + contentLengthLine + CRLF + str); // writeChannel(result, str); try { result.shutdownOutput(); result.shutdownInput(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { result.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } attachment.accept(attachment, this); } @Override public void failed(Throwable exc, AsynchronousServerSocketChannel attachment) { // TODO Auto-generated method stub } public void writeChannel( AsynchronousSocketChannel channel, String s) { Future<Integer> future = channel.write(ByteBuffer .wrap(s.getBytes())); try { future.get(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); Thread.sleep(400000); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("finished server"); } } public static void main(String... args) throws Exception { AioServer server = new AioServer(8080); new Thread(server).start(); } }
基于AIO实现的web服务器并发性能要比NIO以及Netty实现的服务器并发要高,这最主要的还是他是基于Proactor的IO处理模型,把读写操作转交右操作系统负责
(当然这里静态页面比较小,传输上比较节约时间,但不会有很大影响)
基于Netty以及NIO的实现的服务器并发可以达到每秒处理6-7千request,但是用AIO实现的话,那足可以上9000+(以我的机器为标注),而tomcat也只是3-4000而已,都是以静态相同页面为标注
不得不说,AIO的异步处理还是很强大的,不过可能在负载均衡处理控制上要比NIO差
评论(0)