`
zhaohaolin
  • 浏览: 1010911 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用netty 作为 http服务器【转】

 
阅读更多

netty是继mina之后一个非常受欢迎的nio网络框架(其实netty的主程就是mina的主程).

其实netty的介绍就不说了,去看项目介绍吧,直接上代码

httpserver启动和配置类

 

import static org.jboss.netty.channel.Channels.pipeline;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
import org.jboss.netty.handler.stream.ChunkedWriteHandler;

/**
 * 后台管理服务
 * 
 * @author javagg
 * 
 */
public class AdminServer {
	public static void main(String[] args) {
		start(8080);
	}

	public static void start(int port) {
		// 配置服务器-使用java线程池作为解释线程
		ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
		// 设置 pipeline factory.
		bootstrap.setPipelineFactory(new ServerPipelineFactory());
		// 绑定端口
		bootstrap.bind(new InetSocketAddress(port));
		System.out.println("admin start on "+port);
	}

	private static class ServerPipelineFactory implements
			ChannelPipelineFactory {
		public ChannelPipeline getPipeline() throws Exception {
			// Create a default pipeline implementation.
			ChannelPipeline pipeline = Channels.pipeline();
			pipeline.addLast("decoder", new HttpRequestDecoder());
			pipeline.addLast("encoder", new HttpResponseEncoder());
			//http处理handler
			pipeline.addLast("handler", new AdminServerHandler());
			return pipeline;
		}
	}
}

 

handler类

import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE;
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST;
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.INTERNAL_SERVER_ERROR;
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.OK;
import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1;

import java.util.HashMap;

import mmo.test.UITestHandle;

import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.buffer.DynamicChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.jboss.netty.handler.codec.frame.TooLongFrameException;
import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
import org.jboss.netty.handler.codec.http.HttpRequest;
import org.jboss.netty.handler.codec.http.HttpResponse;
import org.jboss.netty.handler.codec.http.HttpResponseStatus;
import org.jboss.netty.util.CharsetUtil;

/**
 * @author javagg
 */
public class AdminServerHandler extends SimpleChannelUpstreamHandler {

	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		HttpRequest request = (HttpRequest) e.getMessage();
		String uri = request.getUri();
                          System.out.println("uri:"+uri);
		HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
                          ChannelBuffer buffer=new DynamicChannelBuffer(2048);
		buffer.writeBytes("hello!! 你好".getBytes("UTF-8"));
		response.setContent(buffer);
		response.setHeader("Content-Type", "text/html; charset=UTF-8");
		response.setHeader("Content-Length", response.getContent().writerIndex());
		Channel ch = e.getChannel();
		// Write the initial line and the header.
		ch.write(response);
		ch.disconnect();
		ch.close();
		
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
			throws Exception {
		Channel ch = e.getChannel();
		Throwable cause = e.getCause();
		if (cause instanceof TooLongFrameException) {
			sendError(ctx, BAD_REQUEST);
			return;
		}

		cause.printStackTrace();
		if (ch.isConnected()) {
			sendError(ctx, INTERNAL_SERVER_ERROR);
		}
	}

	private void sendError(ChannelHandlerContext ctx, HttpResponseStatus status) {
		HttpResponse response = new DefaultHttpResponse(HTTP_1_1, status);
		response.setHeader(CONTENT_TYPE, "text/plain; charset=UTF-8");
		response.setContent(ChannelBuffers.copiedBuffer("Failure: " + status.toString() + "\r\n", CharsetUtil.UTF_8));

		// Close the connection as soon as the error message is sent.
		ctx.getChannel().write(response).addListener(ChannelFutureListener.CLOSE);
	}
}
分享到:
评论

相关推荐

    使用netty使用http协议开发文件服务器

    在本示例中,我们将探讨如何使用Netty实现一个基于HTTP协议的文件服务器。 首先,我们需要理解HTTP协议。HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,它规定了客户端(如浏览器)和服务器之间数据...

    spring+mybatis+netty3.6 HTTP服务器项目

    【标题】"Spring+Mybatis+Netty3.6 HTTP服务器项目"是一个综合性的Web服务开发实例,结合了三个核心的开源技术框架:Spring、Mybatis和Netty3.6。这个项目旨在创建一个高性能、可扩展的HTTP服务器,能够处理GET和...

    C# Netty 客户端,服务器端包含接双向接收

    标题中的"C# Netty 客户端,服务器端包含双向接收"揭示了这是一个关于使用C#语言实现基于Netty框架的客户端和服务器端通信的项目。Netty是Java平台上的一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可...

    基于Netty消息框架的Java游戏服务器.zip

    在构建高性能、高并发的游戏服务器时,Netty作为一个强大的异步事件驱动的网络应用程序框架,被广泛应用。"基于Netty消息框架的Java游戏服务器"项目,旨在利用Netty的特性来设计并实现一个高效的游戏服务器。这个...

    netty客户端与服务器信息交互demo

    在信息交互过程中,Netty使用ByteBuf作为数据容器,它提供了高效且灵活的内存管理。ByteBuf可以读写字节,支持缓冲区的切片和复制,降低了数据传输的开销。 在代码示例中,你可能会看到ChannelHandlerContext,它是...

    netty基于http socket websocke及心跳包机制t的demo

    Socket在Netty中通常用于构建自定义的通信协议,或者作为HTTP之外的另一种网络通信方式。 WebSocket是一种在单个TCP连接上进行全双工通信的协议,它极大地简化了浏览器和服务器之间的数据传输。Netty提供了...

    Android与Netty服务器连接

    在Android开发中,有时我们需要实现一个客户端应用与服务器进行高效、稳定的通信,这时Netty作为一个高性能、异步事件驱动的网络应用程序框架就显得尤为重要。本文将深入探讨如何在Android平台上利用Netty构建客户端...

    jar包直接当做web服务,netty负责http协议,配合springMVC,再也不用tomcat了

    在这样的架构中,Spring MVC处理业务逻辑和路由,而Netty则作为HTTP服务器,两者协同工作。开发者可以通过Netty自定义HTTP处理器,接收来自客户端的请求,然后通过Spring MVC进行业务逻辑处理。视图部分可能需要使用...

    Netty4.0 http案例

    总的来说,这个"Netty4.0 http案例"涵盖了如何使用Netty构建高效、可扩展的HTTP服务器和客户端,以及如何处理JSON数据。通过理解这些知识点,你不仅可以实现基本的HTTP通信,还能进一步探索更复杂的网络应用场景。

    netty服务器解析16进制数据

    分析这个代码,我们可以看到Netty如何创建服务器、设置管道、以及如何定义和使用自定义的解码器和编码器来处理16进制数据。 通过上述步骤,Netty服务器可以轻松地解析16进制数据,从而支持各种网络协议,无论它们是...

    Netty实战 电子版.pdf_java_netty_服务器_

    通过学习《Netty实战》,开发者可以掌握如何使用Netty搭建高性能的TCP、UDP服务器,如何处理HTTP请求,以及如何实现WebSocket等现代网络应用。书中会详细讲解如何配置和使用这些特性,以及如何解决实际开发中遇到的...

    Netty 实现scoket 主动推送数据到服务和服务端实现方式

    客户端发送16进制给服务端,并行实现socket通道活动状态...netty作为服务器端如何主动的向传感器发送消息,我尝试当每个传感器连接到netty(TCP/IP)时使用一个map把该channelSocket的id和该channelSocket绑定在一起。

    netty 代理服务器

    HTTP 代理服务器的作用是作为客户端与目标服务器之间的中介,接收客户端的请求,转发到目标服务器,并将服务器的响应返回给客户端。这种设计有多种用途,如缓存、访问控制、流量监控和负载均衡等。 在 Netty 中构建...

    Netty粘包分包服务器端客户端完整例子

    Netty作为一款流行的Java异步事件驱动的网络应用框架,为处理TCP、UDP等网络协议提供了强大而灵活的支持。在使用Netty进行网络通信时,"粘包"和"分包"是两个常见的问题,这两个概念在标题和描述中被提及。 粘包和...

    netty整理的源码

    `netty4-jedis-proxy-master.zip`可能是一个使用Netty作为代理服务器,用于在客户端和Jedis(一个流行的Redis Java客户端)之间转发命令。通过这种方式,Netty可以提供额外的性能优化和负载均衡功能。 最后,`netty...

    netty http协议开发小例子

    - 在描述中提到的代码示例可能是一个简单的文件服务器,服务器接收到 GET 请求时,会查找请求的资源路径对应的实际文件,然后读取文件内容作为响应主体。 - 通过 `FileRegion` 类可以方便地将文件内容发送出去,它...

    java物联网的netty服务器

    2. 高效缓冲区处理:Netty使用ByteBuf作为其缓冲区,它提供了对原始字节的高效管理,避免了多次内存拷贝。ByteBuf支持预读和后读,以及多种数据类型转换,极大地提高了数据处理速度。 3. 协议支持:Netty提供了许多...

    Netty 高并发深入浅出学习高并发服务器

    - Netty 提供 ByteBuf 作为字节缓冲区,替代了 Java NIO 中的 ByteBuffer,提供了更高效的操作方式。 - **Decoder 和 Encoder**:自定义编解码器可以将复杂的协议转换为简单的对象,或反之,简化数据处理。 4. **...

    用Netty实现Websocket(包含服务器代码和客户端网页)

    本教程将详细讲解如何使用Netty实现Websocket服务器以及对应的客户端网页。首先,我们需要理解Netty的核心概念:Channel、EventLoopGroup和Bootstrap。Channel是网络连接的抽象,用于读写数据;EventLoopGroup是一组...

    springboot+netty开发简易式游戏源码

    2. **游戏服务器**:Netty作为游戏服务器,监听客户端的TCP连接,处理游戏状态更新、消息广播等实时通信。 3. **WebSocket集成**:Spring Boot可以通过WebSocket Stomp协议与Netty进行交互,提供实时双向通信。 4. *...

Global site tag (gtag.js) - Google Analytics