当前位置:首页 > CN2资讯 > 正文内容

Android netty服务器 netty服务器搭建

3天前CN2资讯


一、Netty服务器搭建步骤

  • 1) 构建一对主从线程池
  • 2) 为服务器设置channel
  • 3) 设置处理从线程池得助手类初始化起
  • 4) 监听启动和关闭服务器

设置Channel初始化器

每一个Channel都是由多个handler共同组成的管道(pipeline),每个管道都类似于一个小助手,需要程序员初始化时自动设置,一个管道可以理解为一个大的拦截器,而里面的handler可以理解为一个小的拦截器。

1. 定义服务启动类

package org.wdzl; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; /* 实现客户端发送请求,服务器给与响应 hello netty */ //每次客户端和服务器端连接后都会产生一个Channel对象 public class HelloNettyServer { public static void main(String[] args) throws Exception { //创建一组线程池组 //主线程池: 用于接收客户端的请求链接,不做任务处理 EventLoopGroup group1 = new NioEventLoopGroup(); //从线程池: 主线程组会把任务交给它,让其做任务 EventLoopGroup group2 = new NioEventLoopGroup(); try{ //创建服务器启动类 ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(group1, group2) //设置主从线程池 .channel(NioServerSocketChannel.class) //设置nio双向通道 .childHandler(new HelloNettyServerInitializer()); //添加子处理器,用于处理从线程池交过来的任务 //启动服务,并且设置端口号,同时启动的方式为同步 ChannelFuture channelFuture = serverBootstrap.bind(8888).sync(); //监听关闭的channel,设置为同步方式 channelFuture.channel().closeFuture().sync(); }finally { group1.shutdownGracefully(); //优雅得进行关闭 group2.shutdownGracefully(); } } }

2. 定义服务器启动初始化类

package org.wdzl; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.http.HttpServerCodec; /* 初始化器,channel注册之后会执行里面的相应的初始化方法 */ public class HelloNettyServerInitializer extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel channel) throws Exception { //通过SocketChannel去获取对应的管道 ChannelPipeline pipeline = channel.pipeline(); //通过管道添加handler //new HttpServerCodec()是由netty自己提供的助手类,可以理解为拦截器 //当请求到服务器,我们需要解码,响应到客户端需要做编码 pipeline.addLast("HttpServerCodec", new HttpServerCodec()); //添加自定义助手类,给客户端浏览器渲染hello netty~ pipeline.addLast("CunstomHandler", new CustomHandler()); } }

3. 自定义Handler

package org.wdzl; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.*; import io.netty.util.CharsetUtil; /** * 自定义助手类 */ public class CustomHandler extends SimpleChannelInboundHandler<HttpObject> { @Override protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception { //获取channel Channel channel = ctx.channel(); //需要先判断是否是HttpRequest 不然服务器端就会报错 if(msg instanceof HttpRequest){ //在控制台打印远程地址 System.out.println(channel.remoteAddress()); //定义向客户端发送的数据内容 ByteBuf content = Unpooled.copiedBuffer("Hello netty~", CharsetUtil.UTF_8); //构建http response(设置版本号以及状态码) FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_0, HttpResponseStatus.OK, content); //为响应增加数据类型和长度 response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain"); response.headers().set(HttpHeaderNames.CONTENT_LENGTH, content.readableBytes()); //把响应渲染到html客户端页面上 ctx.writeAndFlush(response); } } @Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception{ System.out.println("channel 注册"); } @Override public void channelUnregistered(ChannelHandlerContext ctx) throws Exception{ System.out.println("channel 移除"); } @Override public void channelActive(ChannelHandlerContext ctx) throws Exception{ System.out.println("channel 活跃"); } @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception{ System.out.println("channel不活跃"); } @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception{ System.out.println("助手类添加"); } @Override public void handlerRemoved(ChannelHandlerContext ctx) throws Exception{ System.out.println("助手类移除"); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception{ System.out.println("channel 读取完毕"); } @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception{ System.out.println("用户事件触发"); } @Override public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception{ System.out.println("channel 可写更改"); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception{ System.out.println("捕获到异常"); } }

二、Channel的生命周期

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/20906.html

    分享给朋友:

    “Android netty服务器 netty服务器搭建” 的相关文章

    樱花VPS:高性价比的日本虚拟专用服务器推荐

    樱花VPS是一个由日本知名主机提供商Sakura Internet Inc.推出的虚拟专用服务器产品。在选择VPS时,用户常常关注服务的稳定性、速度和价格等方面,而樱花VPS正是在这些核心领域表现出色,吸引了一大批用户的关注。 首先,樱花VPS以其高性价比闻名。作为国内前三强的VPS提供商。其规模化...

    DMIT VPS评测:高性能与稳定性的完美结合

    在了解DMIT VPS之前,我想先分享一下我对这家公司的最初印象。记得第一次听到DMIT时,它的名字总是在VPS领域中流传。人们提到它时,无一不带着敬仰,增加了我对它的好奇心。自从它在2017年成立以来,DMIT便以其优秀的服务和产品迅速吸引了不少用户。我也开始关注起它背后的故事。 DMIT的崛起显...

    Virmach Coupons: 轻松获取超值优惠,优化你的VPS选择

    Virmach成立于2014年,作为一家美国VPS服务商,在业内享有良好的声誉。它的总部位于加利福尼亚州洛杉矶,正是这样得天独厚的地理位置让它能迅速成长并服务全球用户。到现在为止,Virmach已经发展成为一家提供各种配置和价格方案的服务商,特别以低价VPS而闻名,吸引了大量希望降低运营成本的个人和...

    高性能HKT VPS服务评测与应用指南

    HKT VPS概述 什么是HKT VPS HKT VPS其实就是基于香港HKT网络架构的虚拟专用服务器,提供了强大的性能和灵活的可配置性。我从多个服务商的不同产品中了解到,HKT VPS非常适合对网络速度和稳定性要求较高的用户。无论是游戏玩家还是企业用户,都能通过它享受到快速的上传和下载速度。 HK...

    如何在VPS环境下使用安卓模拟器与火狐浏览器实现高效管理

    当我们讨论VPS和安卓模拟器的结合时,首先要明白VPS的基本概念。虚拟专用服务器(VPS)实际上是一种将物理服务器划分成多个虚拟服务器的技术。每个VPS都可以独立运行操作系统,用户可以完全控制这个环境。这意味着我们可以在VPS上安装各种软件,包括安卓模拟器,这样就能在计算机上模拟安卓手机的使用。 说...

    解决远程登录Windows Server密码错误的有效步骤

    在尝试远程登录Windows Server时,密码错误是一个常见的问题。遇到这种情况,我通常首先会彻底检查一下用户名和密码的输入。看似简单的步骤实际上可能会被忽视。我会确保输入的每个字符都是正确的,尤其是大小写和特殊字符,确保没有打错。这样的细节容易被忽略,却常常是导致失败登录的主因。 之后,我会关...