Practical Netty (6) HTTP Server/Client
- 作者:柳大·Poechant(钟超)
- 邮箱:zhongchao.ustc#gmail.com(# -> @)
- 博客:Blog.CSDN.net/Poechant
- 微博:weibo.com/lauginhom
- 产品:Club http://whatsclub.cn
- 日期:June 18th, 2012
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.Names
和HttpHeaders.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 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 客户机/服务器,带有联网的反应器 反应器联网 http://projectreactor.io/docs/netty/release/api/在软件许可证 2.0许可,,,。
netty http client & server 示例源码
Netty (netty-netty-5.0.0.Alpha2.tar.gz)是一个 NIO 客户端服务器框架,可以快速轻松地开发协议服务器和客户端等网络应用程序。它极大地简化和流线了网络编程,例如 TCP 和 UDP 套接字服务器。 “快速和简单”并...
找了很久很久,才找到的可用的这个,不是我自己写的,我只是个搬运工,测试过了,并使用了。 评价:好使,不是我手写的,但是我都调试过了
netty+proto client和server连接登录demo。 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
一个netty建立的SSL双向加密的服务器和客户端的简单示例。工程是IDEA创建的,直接导入即可,注意需要依赖的pom文件中的包。需要的证书文件示例也在压缩包内。
Netty base server, client echo program
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实现websocket server。通过构建java客户端程序满足页面的发起websocket请求,实现业务的交互
udp消息通信的服务器端和客户端代码,在局域网内,启用此demo来通信,如传递ip地址,断开,或者其他消息等
一个基于netty实现的servlet容器,可以很好的与springboot集成(jdk1.8 +) 作者邮箱: github地址: : 使用方法 1.添加依赖,在pom.xml中加入 <groupId>com.github.wangzihaogithub</groupId> <artifactId>...
netty android收发消息的hello World ,代码包含android客户端(studio)和服务端,简单实现收发消息交互
本源代码例子实现了Socket服务端和客户端,以及Http服务端和客户端;采用了Netty框架,实现SSL/TLS支持。
在网上查的资料,整理了一下 实现了wss协议的连接 和websocket的心跳,,在网上查的资料,整理了一下 实现了wss协议的连接 和websocket的心跳
赠送jar包:reactor-netty-http-1.0.11.jar; 赠送原API文档:reactor-netty-http-1.0.11-javadoc.jar; 赠送源代码:reactor-netty-http-1.0.11-sources.jar; 赠送Maven依赖信息文件:reactor-netty-...
使用之前需要配置pom.xml ...-- https://mvnrepository.com/artifact/io.netty/netty-all --> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.50.Final</version> </dependency>
赠送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...
赠送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...