一个基于AIO实现的简单web服务器

本文介绍了一个使用AIO实现的简单Web服务器示例,并对比了其与NIO及Netty实现的服务器在并发性能上的优势。该服务器能够高效处理大量请求,展示了AIO在异步IO处理方面的强大能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一下是一个基于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 str = "<html><head><title>test</title></head><body><p>this is a socketserver test</p></body></html>";
						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:" + str.length()
								+ CRLF;


						@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也这样的成品的产品也是9000左右而已,都是以静态相同页面为标注


不得不说,AIO的异步处理还是很强大的,不过可能在负载均衡处理控制上要比NIO差




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值