使用Netty3或Netty4发布Http协议服务

今天给大家简单的介绍一下Netty,让大家以后在使用到Netty的时候能够有一定的了解和基础,这样深入学习Netty以及以后灵活应用这门技术也就不在话下了,万丈高楼平地起,程序猿们平时还是要注重积累,多花些时间在技术上面,如果实在对代码提不起兴趣就早点规划好自己的发展路线,死磕着也没什么必要,对自己没啥好处,但是如果你至少不讨厌编程,那么还是多多学习吧!

Netty是什么

Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

Netty的架构

使用Netty3或Netty4发布Http协议服务

Netty的特性

设计:

------统一的API,适用于不同的协议(阻塞和非阻塞)

------基于灵活、可扩展的事件驱动模型

------高度可定制的线程模型

------可靠的无连接数据Socket支持(UDP)

性能:

------更好的吞吐量,低延迟

------更省资源

------尽量减少不必要的内存拷贝

安全:

------完整的SSL/TLS和STARTTLS的支持

------能在Applet与谷歌Android的限制环境运行良好

健壮性:

------不再因过快、过慢或超负载连接导致OutOfMemoryError

------不再有在高速网络环境下NIO读写频率不一致的问题

易用:

------完善的Java doc,用户指南和样例

------简洁简单

------仅依赖于JDK1.5

Netty怎么用

小Alan教大家使用Netty3或Netty4发布Http协议服务接口,来引导大家进入Netty的世界。

Netty3实现Http协议服务接口步骤:

第一步:创建Http业务处理服务类,代码如下

package com.alanlee.http;

import static org.jboss.netty.handler.codec.http.HttpResponseStatus.OK;
import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.DynamicChannelBuffer;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFuture;
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.http.DefaultHttpResponse;
import org.jboss.netty.handler.codec.http.HttpRequest;
import org.jboss.netty.handler.codec.http.HttpResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * HTTP服务业务处理类.
 *
 * @author AlanLee
 * @version 2018/01/11
 *
 */
public class HttpServerHandler extends SimpleChannelUpstreamHandler
{

/**
    * 日志类.
    */
    protected static final Logger LOGGER = LoggerFactory.getLogger(HttpServerHandler.class);

@Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception
    {

HttpRequest request = (HttpRequest) e.getMessage();
        String method = request.getMethod().getName();
        String url = request.getUri().toLowerCase();
        System.out.println(method);
        System.out.println(url);
       
        // 接收请求内容并打印
        ChannelBuffer buffer = request.getContent();
        String requestStr = new String(buffer.array(), "UTF-8");
        System.out.println(requestStr);

// 处理响应消息
        HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
        ChannelBuffer responseBuffer = new DynamicChannelBuffer(2048);
        responseBuffer.writeBytes("你是猪吗?".getBytes("UTF-8"));
        response.setContent(responseBuffer);
        // 返回内容的MIME类型
        response.setHeader("Content-Type", "text/html; charset=UTF-8");
        // 响应体的长度
        response.setHeader("Content-Length", response.getContent().writerIndex());
        Channel ch = e.getChannel();

// 响应给客户端
        ChannelFuture f = ch.write(response);

// 数据发送完毕,则关闭连接通道.
        f.addListener(new ChannelFutureListener()
        {
            public void operationComplete(ChannelFuture future) throws Exception
            {
                future.getChannel().close();
            }
        });
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/986c827f7d9034254685abb63c9f958c.html