`
Poechant
  • 浏览: 229440 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24307
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22095
社区版块
存档分类
最新评论

Practical Netty (6) HTTP Server/Client

阅读更多

Practical Netty (6) HTTP Server/Client


Netty 提供的 HTTP 功能,比较适合在 Netty 搭建的 TCP 或 UDP 服务器上做一些专用的 HTTP 服务,而非一般性的通用 HTTP 服务器。所以不要将 Netty 的自行实现的 HTTP 服务器的易用性与现有 Nginx、Lighttpd 等来比较。

1 HTTP Server

主要不同就是 Pipeline 用什么 handlers,以及我们自定义的 handler 如何处理 HttpRequest,并生成相应的 HttpResponse。

public class ServerPipelineFactory implements ChannelPipelineFactory {

    public ChannelPipeline getPipeline() throws Exception {
        ChannelPipeline pipeline = Channels.pipeline();

        pipeline.addLast("decoder", new HttpRequestDecoder());
        pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
        pipeline.addLast("encoder", new HttpResponseEncoder());
        pipeline.addLast("handler", new PoechantRequestHandler());

        return pipeline;
    }
}

如何接收 request?如何解析 request?如何产生 response?就看下面的 request handler。

public class PoechantRequestHandler extends SimpleChannelUpstreamHandler {
    @Override
    public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
            throws Exception {
        System.out.println("channel connected...");
        super.channelConnected(ctx, e);
    }
    
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
        HttpRequest request = (HttpRequest) e.getMessage();
        System.out.println(
            "request length:  " + 
            ((HttpRequest) e.getMessage()).getContent().readableBytes());
        HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
        response.setContent(ChannelBuffers.copiedBuffer("I'm a response", CharsetUtil.UTF_8));
        response.setHeader(CONTENT_TYPE, "text/plain; charset=UTF-8");
        e.getChannel().write(response).addListener(ChannelFutureListener.CLOSE);
    }
}

在 Response 中 还可以设置其他的 Headers:

response.setHeader(HttpHeaders.Names.CONTENT_LENGTH, 123);
response.setHeader("Content", "keep-alive");

还有一些 Headers 相关的 Name 和 Value,可以在HttpHeaders.NamesHttpHeaders.Values中找到。

2. HTTP Client

ClientBootstrap 一旦连接成功,就可以发送 HttpRequest 了,连接的代码实例如下:

Channel channel =
    cb.connect(
        new InetSocketAddress("10.0.0.110", 9980)).awaitUninterruptibly().getChannel();

如上是一个阻塞式的连接方式,在连接确认成功或失败前,会一直 block 在那里。异步的方式则如下:

ChannelFuture future = cb.connect(new InetSocketAddress("10.0.0.110", 9980));
Channel channel = future.getChannel();

然后就可以用这个 channel 发消息了。如果是异步的,则要监听成功之后再发送。

future.addListener(new ChannelFutureListener() {
    public void operationComplete(ChannelFuture future) throws Exception {
        // send a request to the http server
    }
});

然后就可以发送数据了。如果是异步的,

HttpRequest request = 
    new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/docs/index.html");
request.addHeader(HttpHeaders.Names.HOST, "10.0.0.110");
channel.write(request).awaitUninterruptibly().getChannel().getCloseFuture().awaitUninterruptibly();

当然你也可以异步发送。

channel.write(request);channel.write(request);

-

Club 产品官网:http://whatsclub.cn 年轻人的兴趣俱乐部(社区)

转载请注明来自柳大的CSDN博客:Blog.CSDN.net/Poechant,微博:weibo.com/lauginhom

-

分享到:
评论

相关推荐

    利用netty实现Modbus TCP client/server

    利用netty实现Modbus TCP client/server READ COILS | 0x01 READ DISCRETE INPUTS | 0x02 READ HOLDING REGISTERS | 0x03 READ INPUT REGISTERS | 0x04 WRITE SINGLE COIL | 0x05 WRITE SINGLE REGISTER | 0x06 ...

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

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

    netty http client & server

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

    netty框架各种通信C/S端

    在这个"Netty框架各种通信C/S端"的资源中,包含了使用Netty实现客户端(Client)和服务器(Server)通信的实例。 1. **TCP通信**: TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的...

    基于Netty实现的MQTT客户端_netty-mqtt-client.zip

    基于Netty实现的MQTT客户端_netty-mqtt-client

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

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

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)

    Netty (netty-netty-5.0.0.Alpha2.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...

    netty+proto client和server连接demo

    netty+proto client和server连接登录demo。 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。

    Netty和SSL/TLS应用例子

    Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Java世界中,Netty因其高效性、灵活性和丰富的特性集而备受推崇。SSL(Secure Sockets Layer)和TLS...

    udp server client demo

    在这个“udp server client demo”中,我们将探讨如何实现一个简单的UDP服务器和客户端通信模型。 1. UDP服务器端: - 服务器端首先需要绑定一个特定的IP地址和端口号,以便接收来自客户端的数据。在编程中,这...

    SocketIO-NettyClient&Server.zip

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

    Netty4.0学习笔记系列之一:Server与Client的通讯

    在本文中,我们将深入探讨Netty 4.0的学习笔记,特别是关于Server与Client之间的通信机制。 首先,我们要理解Netty的核心概念——NIO(非阻塞I/O)。Netty基于Java NIO库构建,它提供了更高级别的API,简化了多路...

    netty android Client + server

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在Android平台上,使用Netty可以构建高效、可靠的网络通信应用,尤其是在需要处理大量并发连接时。本项目提供...

    transport-netty4-client-5.5.1-API文档-中英对照版.zip

    赠送jar包:transport-netty4-client-5.5.1.jar; 赠送原API文档:transport-netty4-client-5.5.1-javadoc.jar; 赠送源代码:transport-netty4-client-5.5.1-sources.jar; 赠送Maven依赖信息文件:transport-netty...

    netty-all-4.1.97.Final-20230731.020124-2.jar netty最新jar包,可直接导入使用

    Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming

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

    在IT行业中,Netty是一个非常流行的高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能协议服务器和客户端。在这个场景中,我们关注的是如何使用Netty来实现服务端支持SSL协议,以便实现WebSocket...

    netty-httpserver

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

    基于Qt5.12实现TFTP的Server和Client

    TFTP协议是基于UDP的简单文件传输协议,协议双方为Client和Server.Client和Server之间通过5种消息来传输文件,消息前两个字节Code是消息类型,消息内容随消息类型不同而不同。传输模式有三种:octet,netascii和mail,...

    transport-netty4-client-6.3.0-API文档-中文版.zip

    赠送jar包:transport-netty4-client-6.3.0.jar; 赠送原API文档:transport-netty4-client-6.3.0-javadoc.jar; 赠送源代码:transport-netty4-client-6.3.0-sources.jar; 赠送Maven依赖信息文件:transport-netty...

Global site tag (gtag.js) - Google Analytics