`
kanpiaoxue
  • 浏览: 1781609 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Netty4 httpserver

 
阅读更多
/**
 * <pre>
 * AjaxResult.java
 * @author kanpiaoxue<br>
 * @version 1.0
 * Create Time 2014年12月4日 下午6:01:05<br>
 * Description : ajax请求结果
 * </pre>
 */
public class AjaxResult {
    private int code;
    private String message;
    private Object body;

    public static AjaxResult SUCCESS = new AjaxResult(0, "success");
    public static AjaxResult FAILURE = new AjaxResult(1, "failure");

    /**
     * <pre>
     * @param code
     * @param message
     * </pre>
     */
    private AjaxResult(int code, String message) {
        super();
        this.code = code;
        this.message = message;
    }

    /**
     * <pre>
     * @return the body
     * </pre>
     */
    public Object getBody() {
        return body;
    }

    /**
     * <pre>
     * @return the code
     * </pre>
     */
    public int getCode() {
        return code;
    }

    /**
     * <pre>
     * @return the message
     * </pre>
     */
    public String getMessage() {
        return message;
    }

    /**
     * <pre>
     * @param body the body to set
     * </pre>
     */
    public AjaxResult setBody(Object body) {
        this.body = body;
        return this;
    }

    /**
     * <pre>
     * @param code the code to set
     * </pre>
     */
    public AjaxResult setCode(int code) {
        this.code = code;
        return this;
    }

    /**
     * <pre>
     * @param message the message to set
     * </pre>
     */
    public AjaxResult setMessage(String message) {
        this.message = message;
        return this;
    }

}

 

import static io.netty.handler.codec.http.HttpHeaders.Names.CONNECTION;
import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_LENGTH;
import static io.netty.handler.codec.http.HttpHeaders.Names.CONTENT_TYPE;
import static io.netty.handler.codec.http.HttpHeaders.Names.EXPIRES;
import static io.netty.handler.codec.http.HttpResponseStatus.NOT_FOUND;
import static io.netty.handler.codec.http.HttpResponseStatus.OK;
import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Charsets;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpHeaders.Values;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.QueryStringDecoder;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Pattern;

/**
 * <pre>
 * HttpServerInboundHandler.java
 * @author kanpiaoxue<br>
 * @version 1.0
 * Create Time 2014年12月4日 下午4:51:07<br>
 * Description : HttpServerInboundHandler
 * </pre>
 */
public class HttpServerInboundHandler extends ChannelInboundHandlerAdapter {

    private static final Logger LOGGER = LoggerFactory
            .getLogger(HttpServerInboundHandler.class);

    private static final Pattern SEND_TASK_FOR_METHOD_GET_PATTERN = Pattern
            .compile("/dmap-sf/query(?:\\?.*)?");

    private static final Pattern SEND_TASK_FOR_METHOD_POST_PATTERN = Pattern
            .compile("/dmap-sf/sendMsg(?:\\?.*)?");

    private HttpRequest request;
    private boolean isGet;
    private boolean isPost;

    /**
     * POST: http://localhost:8844/dmap-sf/sendMsg?hello=df&world=women body: we
     * are togather
     *
     * GET: http://localhost:8844/dmap-sf/query?hello=df&world=women
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg)
            throws Exception {
        if (msg instanceof HttpRequest) {
            request = (HttpRequest) msg;

            String uri = request.getUri();
            HttpMethod method = request.getMethod();

            isGet = method.equals(HttpMethod.GET);
            isPost = method.equals(HttpMethod.POST);

            System.out.println(String.format("Uri:%s method %s", uri, method));

            if (SEND_TASK_FOR_METHOD_GET_PATTERN.matcher(uri).matches()
                    && isGet) {
                System.out.println("doing something here.");
                String param = "hello";
                String str = getParamerByNameFromGET(param);
                System.out.println(param + ":" + str);
            }
            if (SEND_TASK_FOR_METHOD_POST_PATTERN.matcher(uri).matches()
                    && isPost) {
                System.out.println("doing something here.");
            } else {
                String responseString = JSON.toJSONString(AjaxResult.FAILURE
                        .setMessage(String.format(
                                "Cann't find the url:%s for method:%s", uri,
                                method.name())));

                writeHttpResponse(responseString, ctx, NOT_FOUND);
                return;
            }

        }

        if (!isGet) {
            if (msg instanceof HttpContent) {
                HttpContent content = (HttpContent) msg;

                ByteBuf buf = content.content();
                String bodyString = buf.toString(Charsets.UTF_8);

                System.out.println("body: " + bodyString);

                String l = getParamerByNameFromPOST("hello", bodyString);
                System.out.println(l);

                buf.release();
                String responseString = JSON.toJSONString(AjaxResult.SUCCESS);
                writeHttpResponse(responseString, ctx, OK);
            }
        }
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        LOGGER.error(cause.getMessage());
        ctx.close();
    }

    private String getParamerByNameFromGET(String name) {
        QueryStringDecoder decoderQuery = new QueryStringDecoder(
                request.getUri());
        return getParameterByName(name, decoderQuery);
    }

    private String getParamerByNameFromPOST(String name, String body) {
        QueryStringDecoder decoderQuery = new QueryStringDecoder("some?" + body);
        return getParameterByName(name, decoderQuery);
    }

    /**
     * <pre>
     * @param name
     * @param decoderQuery
     * @return
     * </pre>
     */
    private String getParameterByName(String name,
            QueryStringDecoder decoderQuery) {
        Map<String, List<String>> uriAttributes = decoderQuery.parameters();
        for (Entry<String, List<String>> attr : uriAttributes.entrySet()) {
            String key = attr.getKey();
            for (String attrVal : attr.getValue()) {
                if (key.equals(name)) {
                    return attrVal;
                }
            }
        }
        return null;
    }

    private void writeHttpResponse(String responseString,
            ChannelHandlerContext ctx, HttpResponseStatus status)
                    throws UnsupportedEncodingException {
        FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1,
                status, Unpooled.wrappedBuffer(responseString
                        .getBytes(Charsets.UTF_8)));
        response.headers().set(CONTENT_TYPE, "text/json");
        response.headers().set(CONTENT_LENGTH,
                response.content().readableBytes());
        response.headers().set(EXPIRES, 0);
        if (HttpHeaders.isKeepAlive(request)) {
            response.headers().set(CONNECTION, Values.KEEP_ALIVE);
        }
        ctx.write(response);
        ctx.flush();
    }

}

 

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture; 
import io.netty.channel.ChannelInitializer; 
import io.netty.channel.ChannelOption; 
import io.netty.channel.EventLoopGroup; 
import io.netty.channel.nio.NioEventLoopGroup; 
import io.netty.channel.socket.SocketChannel; 
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpRequestDecoder; 
import io.netty.handler.codec.http.HttpResponseEncoder; 
/**
 * <pre>
 * HttpServer.java
 * @author kanpiaoxue<br>
 * @version 1.0
 * Create Time 2014年12月4日 下午4:52:39<br>
 * Description : HttpServer
 * </pre>
 */


public class HttpServer {

    private static Log log = LogFactory.getLog(HttpServer.class);
    
    public void start(int port) throws Exception {
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                                @Override
                                public void initChannel(SocketChannel ch) throws Exception {
                                    ch.pipeline().addLast(new HttpResponseEncoder());
                                    ch.pipeline().addLast(new HttpRequestDecoder());
                                    ch.pipeline().addLast(new HttpServerInboundHandler());
                                }
                            }).option(ChannelOption.SO_BACKLOG, 128) 
                    .childOption(ChannelOption.SO_KEEPALIVE, true);

            ChannelFuture f = b.bind(port).sync();

            f.channel().closeFuture().sync();
        } finally {
            workerGroup.shutdownGracefully();
            bossGroup.shutdownGracefully();
        }
    }

    public static void main(String[] args) throws Exception {
        HttpServer server = new HttpServer();
        log.info("Http Server listening on 8844 ...");
        server.start(8844);
    }
}

 

分享到:
评论

相关推荐

    netty http client & server

    在 "netty-http-server" 文件中,我们可以找到一个使用 Netty 实现的 HTTP 服务器示例,它展示了如何接收和处理 HTTP 请求。而在 "netty-http-client" 文件中,包含了一个简单的 HTTP 客户端示例,演示了如何向...

    NettyHTTPServer:用 Netty 4 编写的简单 HTTP 服务器

    用 Netty 4 编写的 HTTP 服务器 任务 需要在netty框架( )上实现一个http服务器,功能如下: 根据对请求在 10 秒后发送“Hello World” 根据对请求,重定向到指定的 url 根据对请求统计信息: 请求总数 唯一...

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

    Netty提供了WebSocket Server和WebSocket Client的实现,使得开发者可以方便地创建WebSocket服务端和客户端应用。WebSocket的优势在于它能够保持持久连接,允许服务器主动向客户端推送数据,非常适合实时通信场景。 ...

    netty-httpserver

    一个基于netty实现的servlet容器,可以很好的与springboot集成(jdk1.8 +) 作者邮箱: github地址: : 使用方法 1.添加依赖,在pom.xml中加入 &lt;groupId&gt;com.github.wangzihaogithub&lt;/groupId&gt; &lt;artifactId&gt;...

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

    "jar包直接当做web服务,netty负责http协议,配合springMVC",这样的架构模式就是一种创新的解决方案,它能够帮助我们构建高性能、低延迟的Web应用,尤其适合那些不依赖于JSP(JavaServer Pages)的纯Web服务项目。...

    reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器.zip

    reactor-netty, TCP/HTTP/UDP 客户机/服务器,带有联网的反应器 反应器联网 http://projectreactor.io/docs/netty/release/api/在软件许可证 2.0许可,,,。

    SocketIO-NettyClient&Server.zip

    在这个"SocketIO-NettyClient&Server.zip"压缩包中,包含了一个使用Java和Netty实现的服务器端和客户端通信的示例。下面将详细解释相关知识点。 1. **Netty框架**: - Netty是一个开源的异步事件驱动的网络应用...

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

    在`HttpFileServer`的`main`函数中,我们会设置Netty的服务器端配置,包括绑定监听的端口、创建EventLoopGroup(线程组)以及定义服务器的ChannelInitializer。EventLoopGroup是Netty用来管理线程的组件,它负责调度...

    netty整理的源码

    Netty的HttpServer模块可以构建高性能的HTTP/HTTPS服务器,支持HTTP/1.x和HTTP/2,可以用于搭建API服务、静态文件服务器或反向代理。 总的来说,Netty因其高度的可定制性、灵活性和性能优势,成为构建网络应用的...

    netty file server 文件服务

    4. **安全性与优化**: - 安全性:为了防止未授权访问,文件服务器应实施权限控制,只允许访问特定目录或文件。此外,考虑使用 SSL/TLS 提供加密通信,确保数据传输安全。 - 优化:对于大文件,可以使用分块传输...

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

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

    resteasy使用netty

    这样,当Netty接收到HTTP请求时,会将其交给RestEasy进行路由和处理,RestEasy会根据@Path注解找到对应的资源方法,并执行该方法。 在实际应用中,我们可以使用以下步骤实现这个过程: 1. 添加依赖:确保项目中...

    springboot整合netty的demo

    为了实现SpringBoot与Netty的交互,我们还需要创建一个`WebFluxConfigurer`的实现类,重写`addtolisteners()`方法,将Netty的`HttpServer`实例注册为监听器。同时,通过`WebFluxConfig`可以定制Reactor Netty的相关...

    esa-httpserver:ESA HttpServer是基于netty的异步事件驱动的HTTP服务器

    ESA HttpServer是基于netty的异步事件驱动的http服务器。 特征 异步请求处理 Http1 / H2 / H2cUpgrade Https HAProxy Epoll / NIO 分块读/写 身体聚集 多部分 指标 更多功能... Maven依赖 &lt; groupId&gt;io....

    netty4server:用 nett4 库编写的服务器

    "netty4server-master" 这个文件夹很可能是 Netty 服务器项目的源代码仓库,包含服务器端的配置、处理器等核心组件。通常,你可以在这里找到以下结构: - src/main/java:存放 Java 源代码,包括服务器的启动类、...

    使用Netty进行Android与Server端通信实现文字发送接收与图片上传

    使用netty进行安卓端发送接收文字,并且附带发送图片功能,折腾了几天的netty总算有点眉目了,做下记录。 详细介绍:http://lison.cc/508.html github下载地址:https://github.com/LisonLiou/netty-learning.git

    nett权威指南,学习整理的demo代码

    4.netty开发httpserver服务 - netty-httpserver 5.netty开发websocket服务 - netty-websocket 6.netty生产级心跳学习,利用IdleStateEvent模拟心跳、断线重连等 - netty-heartbeat 7.netty权威指南中的私有协议栈...

    masker-rest:SDK:基于Netty实现Http Server,极简API发布Rest服务及Websocket服务

    掩蔽休息项目简介:基于Netty实现Http Server框架,极简API发布Rest服务及Websocket服务(端口可替换)主要功能: Http服务器框架rest请求处理注册与分配(同一端口支持发布多个context-path服务),支持重定向,...

    netty-all-4.1.22.Final.jar netty最新版jar包,直接导入

    Netty has been designed carefully with the experiences earned from the implementation of a lot of protocols such as FTP, SMTP, HTTP, and various binary and text-based legacy protocols. As a result, ...

    netty做服务端支持ssl协议实现websocket的wss协议(java)

    4. **配置WebSocketServerProtocolHandler**:Netty提供了`WebSocketServerProtocolHandler`,它是处理WebSocket升级请求的关键。你需要配置这个处理器,指定WebSocket的路径和其他参数。 5. **心跳机制**:...

Global site tag (gtag.js) - Google Analytics