Netty的http服务器编程(三)

 

Netty提供的handler:HttpServerCodec http 请求编解码处理类

第一个netty的例子,,server服务端的编写,客户端使用 curl : http://IP:PORT请求 

服务启动类

 1 public class TestServer {
 2
 3     public static void main(String[] args) throws Exception {
 4
 5         //定义两个线程组
 6         EventLoopGroup bossGroup = new NioEventLoopGroup();//接收连接,分发给worker
 7         EventLoopGroup workerGroup = new NioEventLoopGroup();//处理连接
 8
 9         try{
10             //启动服务器  : 简化服务端启动
11             ServerBootstrap serverBootstrap = new ServerBootstrap();
12             serverBootstrap.group(bossGroup,workerGroup)
13                     .channel(NioServerSocketChannel.class)
14                     .childHandler(new TestServerInitializer());//子处理器
15
16             //绑定端口
17             ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
18             channelFuture.channel().closeFuture().sync();
19         }finally {
20
21             //优雅关闭线程组
22             bossGroup.shutdownGracefully();
23             workerGroup.shutdownGracefully();
24         }
25
26
27
28     }
29
30
31 }

初始化类 :

 1 public class TestServerInitializer extends ChannelInitializer<SocketChannel> {
 2
 3     @Override
 4     protected void initChannel(SocketChannel ch) throws Exception {
 5         //拦截器
 6         ChannelPipeline pipeline = ch.pipeline();
 7         //注册拦截器
 8         pipeline.addLast("httpServerCodec",new HttpServerCodec());//请求编解码
 9         pipeline.addLast("testHttpServerHandler",new TestHttpServerHandler());
10     }
11 }

自定义处理器类:

 1 public class TestHttpServerHandler  extends SimpleChannelInboundHandler<HttpObject> {
 2
 3     //读取客户端的请求,向客户端返回响应的方法
 4     //计划在5.0 改名 messagereceived  消息接收,5.0已废弃
 5     @Override
 6     protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
 7
 8         System.out.println(msg.getClass());
 9
10         System.out.println(ctx.channel().remoteAddress());
11
12         Thread.sleep(8000);
13
14         if(msg instanceof HttpRequest){
15             HttpRequest httpRequest = (HttpRequest)msg;
16
17             System.out.println("请求方法名:"+httpRequest.getMethod().name());
18
19             URI uri = new URI(httpRequest.getUri());
20             if("/favicon.ico".equals(uri.getPath())){
21                 System.out.println("请求favicon.ico");
22                 return;
23             }
24             //构造响应内容
25             ByteBuf content = Unpooled.copiedBuffer("hello world", CharsetUtil.UTF_8);
26
27             FullHttpResponse response = new DefaultFullHttpResponse(
28                     HttpVersion.HTTP_1_1, HttpResponseStatus.OK, content);
29
30             response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain");
31             response.headers().set(HttpHeaderNames.CONTENT_LENGTH,content.readableBytes());
32
33
34             //返回响应
35             ctx.writeAndFlush(response);
36             ctx.close();
37         }
38
39     }
40
41     @Override
42     public void channelActive(ChannelHandlerContext ctx) throws Exception {
43         System.out.println("channel active");
44         super.channelActive(ctx);
45     }
46
47     @Override
48     public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
49         System.out.println("channel registered");
50         super.channelRegistered(ctx);
51     }
52
53     @Override
54     public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
55         System.out.println("handler added");
56         super.handlerAdded(ctx);
57     }
58
59     @Override
60     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
61         System.out.println("channel inactive");
62         super.channelInactive(ctx);
63     }
64
65     @Override
66     public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
67         System.out.println("channel unregistered");
68         super.channelUnregistered(ctx);
69     }
70 }
时间: 2024-10-10 15:32:35

Netty的http服务器编程(三)的相关文章

Linux高性能服务器编程——定时器

 定时器 服务器程序通常管理着众多定时事件,因此有效组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响.位置我们要将每个定时事件封装成定时器,并使用某种容器类型的数据结构,比如链表.排序链表和时间轮将所有定时器串联起来,以实现对定时事件的统一管理. Linux提供三种定时方法: 1.socket选项SO_RECVTIMEO和SO_SNDTIMEO. 2.SIGALRM信号 3.I/O复用系统调用的超时参数 socket选项SO_RCVTI

Linux 高性能服务器编程——高级I/O函数

重定向dup和dup2函数 [cpp] view plaincopyprint? #include <unistd.h> int dup(int file_descriptor); int dup2(int file_descriptor_one, int file_descriptor_two); dup创建一个新的文件描述符, 此描述符和原有的file_descriptor指向相同的文件.管道或者网络连接. dup返回的文件描述符总是取系统当前可用的最小整数值. dup2函数通过使用参数f

服务器编程中的文件描述符

linux系统下一切皆文件,通过虚拟文件系统(VFS)的机制将所有底层屏蔽掉,用户可以通过统一的接口来实现对不同驱动的操作,对于每一个文件需要一个引用来指示,此时文件描述符应用而生,文件描述符类似于widows下的handle,对于文件的大部分操作都是通过这个描述符来操作的,例如read,write.对于每一个文件描述符,内核使用三种数据结构来管理. (1)  每个进程在进程表中都有一个记录项,每个记录项中有一张打开文件描述符表,可将其视为一个矢量,每个描述符占用一项.与每个文件描述符相关联的是

基于Netty打造RPC服务器设计经验谈

自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热情的反馈和若干个优化建议,于是利用闲暇时间,打算对原来NettyRPC中不合理的模块进行重构,并且增强了一些特性,主要的优化点如下: 在原来编码解码器:JDK原生的对象序列化方式.kryo.hessian,新增了:protostuff. 优化了NettyRPC服务端的线程池模型,支持LinkedBl

c++游戏服务器编程学习笔记(一)

c++游戏服务器编程c++运行效率非常高TCP传输控制协议IP网际协议SocketLinux 乌班图开源第三方库BOOST80%游戏服务器端用C++工作量最大的地方是具体的游戏逻辑常见的游戏服务器框架和重点部分的实现IP网际协议详解OSI模型 开放系统的通信交互模型 学术性产物的应用层.表示层.会话层.传输层.网络层.链路层.物理层 IP模型产生于实践用于实践 成为标准 数据进入协议栈的封装以太网封装最小46字节,不足的用0最大1500个字节 IP协议特点:不可靠.无连接不能保证IP的数据报成功

第15章 高并发服务器编程(2)_I/O多路复用

3. I/O多路复用:select函数 3.1 I/O多路复用简介 (1)通信领域的时分多路复用 (2)I/O多路复用(I/O multiplexing) ①同一线程,通过"拨开关"方式,来同时处理多个I/O流,哪个IO准备就绪就把开关拨向它.(I/O多路复用类似于通信领域中的"时分复用") ②通过select/poll函数可以实现IO多路复用,他们采用轮询的方式来监视I/O.而epoll是对select/poll的加强,它是基于事件驱动,epoll_ctl注册事件

服务器编程的一点心得

由于水平有限,以下仅仅是个人的一些心得,希望对新人有一点参考作用.另外由于时间关系,写得有点杂,有些点可能并不是跟服务器编程强相关的. 性能相关 1.     应用各种pool. a)       Mempool 比如为了提高内存分配效率,可以使用Mem pool.当对应的场景简单时,可以自己定制私有的内存池管理.当内存池设计相对复杂的时候,可以考虑直接使用jemalloc.tcmalloc. b)      Socket pool 比如dns解析一般是基于udp协议,为了提高性能,避免反复创建

linux-socket tcp客户端服务器编程模型及代码详解

上一篇文章介绍了 TCP/IP相关协议,socket通信流程和涉及到的各种函数: Socket简单理解 本篇将具体解释tcp客户端服务器编程模型相关的代码 文章分为4个部分: 1. TCP客户端服务器编程模型流程图 2. 网络字节序与主机字节序 3. TCP编程的地址结构 4. 详细案例代码及解释 一: TCP客户端服务器编程模型流程图 上面两张图片将整个流程已经说明的很清楚了; 二: 网络字节序与主机字节序 字节序即是保存数据的方向方式, 分为 大端存储 和 小端存储; 其中 网络字节序 使用

iOS网络编程(三) 异步加载及缓存图片----&gt;SDWebImage

@SDWebImage提供一个UIImageView的类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. @SDWebImage的导入1.https://github.com/rs/SDWebImage 下载SDWebImage开源包2.将类包拖入工程,再导入MapKit.framework.ImageIO.framework两个框架3.SDWebImage是支持ARC的,在MRC的工程中要注意,可参考MRC工程配置ARC4.注意:SDWebImag