`
Donald_Draper
  • 浏览: 985420 次
社区版块
存档分类
最新评论

Netty 构建HTTP服务器示例

阅读更多
netty 网络通信示例一 :http://donald-draper.iteye.com/blog/2383326
netty 网络通信示例二:http://donald-draper.iteye.com/blog/2383328
netty 网络通信示例三:http://donald-draper.iteye.com/blog/2383392
netty 网络通信示例四:http://donald-draper.iteye.com/blog/2383472
前面文章我们在编码器与解码器的示例,及基于textline编解码器通信示例,今天我们通过
Netty来时实现一个简单的HTTP服务器:
HTTP服务器:
package netty.main.http;

import java.net.InetSocketAddress;

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

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.SslContextBuilder;
import io.netty.handler.ssl.util.SelfSignedCertificate;
import netty.initializer.http.HttpHelloWorldServerInitializer;

/**
 * An HTTP server that sends back the content of the received HTTP request
 * in a pretty plaintext form.
 * 
 * @author donald
 * 2017年6月30日
 * 上午11:44:43
 */
public final class HttpHelloWorldServer {
	private static final Logger log = LoggerFactory.getLogger(HttpHelloWorldServer.class);
    static final boolean SSL = System.getProperty("ssl") != null;
    private static final  String ip = "192.168.31.153";
    static final int port = Integer.parseInt(System.getProperty("port", SSL? "8443" : "8080"));

    public static void main(String[] args) throws Exception {
        // Configure SSL.
        final SslContext sslCtx;
        if (SSL) {
            SelfSignedCertificate ssc = new SelfSignedCertificate();
            sslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).build();
        } else {
            sslCtx = null;
        }

        // Configure the server.
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.option(ChannelOption.SO_BACKLOG, 1024);
            b.group(bossGroup, workerGroup)
             .channel(NioServerSocketChannel.class)
             .handler(new LoggingHandler(LogLevel.INFO))
             .childHandler(new HttpHelloWorldServerInitializer(sslCtx));
            InetSocketAddress inetSocketAddress = new InetSocketAddress(ip,port);
            Channel ch = b.bind(inetSocketAddress).sync().channel();
            log.info("=========HttpServer is start=========");
            System.err.println("Open your web browser and navigate to " +
                    (SSL? "https" : "http") + "://"+ip+":" + port + '/');
            ch.closeFuture().sync();
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

Http服务器处理器Initializer:
package netty.initializer.http;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.HttpServerExpectContinueHandler;
import io.netty.handler.ssl.SslContext;
import netty.handler.http.HttpHelloWorldServerHandler;
/**
 * 
 * @author donald
 * 2017年6月30日
 * 上午11:42:49
 */
public class HttpHelloWorldServerInitializer extends ChannelInitializer<SocketChannel> {

    private final SslContext sslCtx;

    public HttpHelloWorldServerInitializer(SslContext sslCtx) {
        this.sslCtx = sslCtx;
    }

    @Override
    public void initChannel(SocketChannel ch) {
        ChannelPipeline p = ch.pipeline();
        if (sslCtx != null) {
            p.addLast(sslCtx.newHandler(ch.alloc()));
        }
        p.addLast(new HttpServerCodec());
        p.addLast(new HttpServerExpectContinueHandler());
        p.addLast(new HttpHelloWorldServerHandler());
    }
}


Http服务器处理器:
package netty.handler.http;

import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener;
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.HttpUtil;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.util.AsciiString;
import static io.netty.handler.codec.http.HttpResponseStatus.*;
import static io.netty.handler.codec.http.HttpVersion.*;

public class HttpHelloWorldServerHandler extends ChannelInboundHandlerAdapter {
    private static final byte[] CONTENT = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd' };
    private static final AsciiString CONTENT_TYPE = new AsciiString("Content-Type");
    private static final AsciiString CONTENT_LENGTH = new AsciiString("Content-Length");
    private static final AsciiString CONNECTION = new AsciiString("Connection");
    private static final AsciiString KEEP_ALIVE = new AsciiString("keep-alive");

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

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        if (msg instanceof HttpRequest) {
            HttpRequest req = (HttpRequest) msg;

            boolean keepAlive = HttpUtil.isKeepAlive(req);
            FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(CONTENT));
            response.headers().set(CONTENT_TYPE, "text/plain");
            response.headers().setInt(CONTENT_LENGTH, response.content().readableBytes());

            if (!keepAlive) {
                ctx.write(response).addListener(ChannelFutureListener.CLOSE);
            } else {
                response.headers().set(CONNECTION, KEEP_ALIVE);
                ctx.write(response);
            }
        }
    }

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

打开浏览器,访问地址:http://192.168.31.153:8080/
浏览器窗口显示Hello world!
0
0
分享到:
评论

相关推荐

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

    Netty是一个高性能、异步事件驱动的网络应用框架,常用于构建高效的服务器和客户端应用程序,尤其是在高并发场景下。在本示例中,我们将探讨如何使用Netty实现一个基于HTTP协议的文件服务器。 首先,我们需要理解...

    android netty cli +probuf示例

    总结来说,“android netty cli +protobuf示例”展示了如何在Android客户端利用Netty的异步网络通信能力和Protobuf的数据序列化特性,构建一个高效的即时通讯系统。这个示例涵盖了从消息定义到网络通信的全过程,...

    netty通信完整示例

    这个“netty通信完整示例”提供了一套完整的Netty使用案例,包括了jar包、服务器端、客户端、编码器和解码器,确保了你能够亲身体验Netty的强大功能。 首先,让我们深入理解Netty的核心概念: 1. **NIO(Non-...

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

    Netty的HTTP模块允许开发者轻松地构建HTTP服务器和客户端,支持GET、POST等各种请求方法,并且能够处理Cookie和HTTP头部。 接下来是Socket,它是网络编程的基础,Netty的Socket API提供了TCP和UDP的支持。通过使用...

    netty http client & server

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

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

    这通常意味着代码可能包括基础示例,用于演示如何在C#环境中设置Netty客户端和服务器,并实现双向通信,即两个端点都能发送和接收数据。 从文件名称列表来看,我们可以推测项目可能包含以下内容: 1. `UpgradeLog....

    Netty通信服务器搭建demo

    Netty是一款高性能、异步事件驱动的网络应用框架,它为Java开发人员提供了构建高性能、稳定、可扩展的网络服务器和客户端的API。在“Netty通信服务器搭建demo”中,我们将探讨如何利用Netty来搭建一个简单的通信...

    netty实现SSL/TSL双向加密认证示例

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本文中,我们将深入探讨如何使用 Netty 实现 SSL/TLS(Secure Sockets Layer/Transport Layer Security)...

    JavaNetty客户端与服务器

    标题"Java Netty客户端与服务器"表明我们将探讨如何使用Netty构建一个简单的服务器和客户端系统,其中客户端能够发送消息到服务器,而服务器则会给予响应。这种通信模式在许多分布式系统中非常常见,例如聊天应用、...

    示例代码:netty promise的简单示例

    以下是一个简单的 Netty Promise 示例代码: ```java import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; public ...

    netty服务器解析16进制数据

    压缩包中的 "LIQUIDSOCKETSERVER" 文件可能是Netty服务器的源代码示例,它可能展示了如何处理16进制数据。分析这个代码,我们可以看到Netty如何创建服务器、设置管道、以及如何定义和使用自定义的解码器和编码器来...

    Netty结合SpringBoot 处理http请求示例源码

    在这个示例中,我们将看到如何将Netty作为HTTP服务器,与Spring Boot的Web服务功能相结合。首先,你需要在Spring Boot项目中引入Netty的相关依赖。接着,创建一个自定义的`ChannelInboundHandler`,这是Netty中的...

    netty http protobuf

    1. **服务器端**:使用Netty构建一个HTTP服务器,监听特定端口,接收HTTP请求。服务器端会解析HTTP请求,然后将请求体中的Protobuf数据解码为Java对象。 2. **客户端**:Netty的HTTP客户端发送HTTP请求到服务器,...

    netty-4.1_javaNetty_netty_服务器_

    Netty 是一个基于 Java 的高性能、异步事件驱动的网络应用程序框架,专为开发协议服务器和客户端而设计。它的核心是基于 NIO(非阻塞 I/O...在 "netty-4.1" 的文档和示例代码中,你会找到更多关于这些主题的详细信息。

    02.Netty服务器的构建.rar

    以下是一个简单的Netty服务器构建示例: ```java public class NettyServer { public static void main(String[] args) throws Exception { // 创建BossGroup和WorkerGroup EventLoopGroup bossGroup = new ...

    netty 代理服务器

    在本文中,我们将深入探讨如何利用 Netty 构建一个 HTTP 代理服务器,以及它的工作原理和核心组件。 HTTP 代理服务器的作用是作为客户端与目标服务器之间的中介,接收客户端的请求,转发到目标服务器,并将服务器的...

    netty框架,服务端、客户端代码示例

    在这个"Netty框架,服务端、客户端代码示例"中,我们将深入探讨如何使用Netty构建服务端和客户端的通信。 首先,让我们了解Netty的基本架构。Netty的核心是它的“线程模型”和“通道”概念。线程模型采用“事件循环...

    netty http协议开发小例子

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

    java物联网的netty服务器

    Java物联网的Netty服务器是一种基于Java的高性能网络应用框架,主要应用于开发高并发...通过深入学习和实践这个项目,开发者可以掌握利用Netty构建物联网服务器的关键技术,为构建高效、可靠的物联网应用打下坚实基础。

    rtmpServer-master_nettyrtmp_rtmp推流_netty开发rtmp_rtmpServer-master

    总的来说,这个项目提供了从零开始构建一个RTMP服务器的参考,可以帮助开发者深入理解RTMP协议以及如何利用Netty构建高性能的网络服务。通过学习和研究这个项目,开发者可以掌握网络编程、实时流媒体传输以及服务器...

Global site tag (gtag.js) - Google Analytics