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

一下是一个基于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差

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

时间: 2024-12-20 01:15:36

一个基于AIO实现的简单web服务器的相关文章

【Web后端笔记】基于Socket实现的简单Web服务器搭建

我们在地址栏中输入的内容称为通用资源标记符(Universal Resource Identifier,URI)它有很多种样式,在Web中我们通常称为统一资源定位符(Uniform Resource Locator,URL)的形式,它的格式如下: 协议://主机[.端口号][绝对路径[?参数]] 在http://www.cnblogs.com/DebugLZQ/中,http表示协议名称;www.cnblogs.com表示主机的地址:可选的端口号没有出现,那么,将使用http协议默认的端口号80:

Socket实现简单Web服务器

上一篇博客中介绍了怎样使用socket访问web服务器.关键有两个: 1)熟悉Socket编程: 2)熟悉HTTP协议. 上一篇主要是通过socket来模拟浏览器向(任何)Web服务器发送(HTTP)请求,重点在浏览器端.本篇博客则反过来讲一下怎样使用socket来实现Web服务器,怎样去接收.分析.处理最后回复来自浏览器的HTTP请求. HTTP协议是浏览器和Web服务器都需要遵守的一种通信规范,如果我们编写一个程序,正确遵守了HTTP协议,那么理论上讲,这个程序可以具备浏览器.甚至Web服务

java实现简单web服务器(分析+源代码)

在日常的开发中,我们用过很多开源的web服务器,例如tomcat.apache等等.现在我们自己实现一个简单的web服务器,基本的功能就是用户点击要访问的资源,服务器将资源发送到客户端的浏览器.为了简化操作,这里不考虑资源不存在等异常情况.web服务基于的是HTTP协议,用户在浏览器的地址栏输入要访问的地址,服务器如何得到该地址是个关键.先看下一般的HTTP请求和响应报文的一般格式: HTTP 请求报文 HTTP 响应报文 web服务器获取一个用户的连接时,会初始化一个线程和用户通信,代码如下:

基于JDK7 NIO2的高性能web服务器实践之二(转)

前一篇博客,我简单提了下怎么为NIO2增加TransmitFile支持,文件传送吞吐量是一个性能关注点,此外,并发连接数也是重要的关注点. 不过JDK7中又一次做了简单的实现,不支持同时投递多个AcceptEx请求,只支持一次一个,返回后再投递.这样,客户端连接的接受速度必然大打折扣.不知道为什么sun会做这样的实现,WSASend()/WSAReceive()一次只允许一个还是可以理解,毕竟简化了编程,不用考虑封包乱序问题.也降低了内存耗尽的风险.AcceptEx却没有这样的理由了. 于是再一

如何使用 Docker 部署一个基于 Play Framework 的 Scala Web 应用?

本文作者 Jacek Laskowski 拥有近20年的应用程序开发经验,现 CodiLime 的软件开发团队 Leader,曾从 IBM 取得多种资格认证.在这篇博文中,Jacek 分享了 Warsaw Scala Enthusiasts Meetup 上 Rafal Krzewski 介绍的一个 Docker sbt 插件.本文系 OneAPM 工程师编译整理: 虽然在 DeepSense.io 项目中,Docker 已得到了非常深入的应用,但是如果没有接触到 Rafal Krzewski

Socket网络编程--简单Web服务器(1)

这一次的Socket系列准备讲Web服务器.就是编写一个简单的Web服务器,具体怎么做呢?我也不是很清楚流程,所以我找来了一个开源的小的Web服务器--tinyhttpd.这个服务器才500多行的代码,使用C语言.这一小节就不讲别的内容了.就对这个程序进行一些注释和讲解了. 主函数: 1 int main(void) 2 { 3 int server_sock = -1; 4 u_short port = 0; 5 int client_sock = -1; 6 struct sockaddr_

Python 实现简单 Web 服务器

Python 实现简单 Web 服务器 最近有个需求,就是要创建一个简到要多简单就有多简单的web服务器,目的就是需要一个后台进程用来接收请求然后处理并返回结果,因此就想到了使用python来实现. 首先创建一个myapp.py文件,其中定义了一个方法,所有的请求都会经过此方法,可以在此方法里处理传递的url和参数,并返回结果. def myapp(environ, start_response): status = '200 OK' headers = [('Content-type', 't

tomcat解析之简单web服务器(图)

链接地址:http://gogole.iteye.com/blog/587163 之前有javaeyer推荐了一本书<how tomcat works>,今天晚上看了看,确实不错,第一眼就着迷了. 于是乎就学着书上的例子敲了敲,学会了一个简单web服务器的大概实现,当然,这个简直就无法称之为web服务器,但是也算是走进web服务器的第一步吧. 这篇文章仅限于学习记录,文笔凌乱之处,还望各位见谅. OK,下面进入正题: 开始之前,首先我们要清楚以下几个内容. 首先,一个最简单服务器包括三个部分:

自己实现简单Web服务器,支持GET POST请求

最近项目上遇到一个需求,最后想到的解决方案是自己实现一个web服务器去处理请求,然后再将信息发送到另外一个程序.然后返回处理之后的结果呈现出来. 现在我就来分享一下如何实现的. 通过.NET 为我们提供的HttpListener类实现对Http协议的处理,实现简单的web服务器. 注意:此类在 .NET Framework 2.0 版中是新增的.所以支持.NET Framework 2.0以上版本.该类仅在运行 Windows XP SP2 或 Windows Server 2003 操作系统的