阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Java游戏服务器系列之Netty详解

28次阅读
没有评论

共计 2488 个字符,预计需要花费 7 分钟才能阅读完成。

导读 今天带大家来学习 Java 游戏服务器的相关知识, 文中对 Netty 作了非常详细的介绍, 对正在学习 java 的小伙伴们有很好的帮助, 需要的朋友可以参考下
一、简介

Java 的底层 API 逐渐复杂,而开发者面对的开发场景需求也在逐渐增大。如果直接针对底层 API 进行编程,无疑是耗时耗力的。这时就催生了极多的编程框架,这些框架隐藏了 API 实现的复杂细节,以最简洁的方式给开发人员提供功能的实现接口。Netty 就是一款针对于网络链接的框架,他的出现让服务器开发人员更加的集中关注于更多逻辑的实现,而不为了实现更好更多更稳定的链接而头疼。Netty 的核心功能基于 NIO 实现。

二、Netty 的应用场景

几乎适用于所有的长短链接场景,由于 Java 应用的广泛性,几乎所有的互联网公司或多或少的都会使用到。博主从事游戏开发,可以说几乎所有短链接游戏服务器都是使用 Netty 开发,实效性要求比较高也有热修复需求的服务器一般不会使用 Java,目前采用更多的是 C +Lua 的组合方式。Java 不可以热修复是很多长链服务器不考虑 java 的一个重要原因。

三、异步和事件驱动性

NIO 文章中强调了,这种模型的主要特地拿就是异步和事件驱动性,异步是服务器不需要一直等待链接输入直到链接关闭。而是可以在某个特定的时候去相应链接的输入,而特定的时候就是另一个事件驱动性,链接发生变化时,会产生一个事件,而 NIO 模型检测到这个事件之后,会去相应这个事件的处理事件。

四、Netty 核心组件

1.Channel:

Channel 时 Java-NIO 的一个基本构造,它代表到一个实体的开放链接,如读操作和写操作,在 NIO 模型中也可以被理解成一个入站或者出站的数据载体,可以被关闭或者关闭。

2. 回调 ChannelHandler:

一个回调就是一个方法,Netty 提供了两个子类,ChannelInboundHandlerAdapter 以及 ChannelOutboundHandlerAdapter , 这两个子类分别可以应用于数据进站和出站时期,各种阶段的回调,比如入站时 Active 方法,表明链接刚刚被建立起,代码如下:

public class ConnectHandler extend ChannelInboundHandlerAdapter{
	@override
	public void ChannelActive(ChannelHandlerContext ctx){
		// 数据入站回调子类被建立时调用,也就是链接建立时调用
		System.out.println("远程客户端 :"+ ctx.channel().remoteAddress() + '建立链接');
	}
}

不了解 Netty 的读者看到这里可能会有点疑惑,这个类应该怎么用。这里简单的解释一下:这种类会在 Netty 创建的时候注册进服务中,然后在数据进站、出站的不同阶段,调用这个类中不同的回调函数,以处理不同的开发需求。可以关注一下读者其他的文章

3.Future:

jdk-Future:Java 中提供了 Future 的实现,这种 Futrue 可以看作是一个异步操作结果的占位符。我们可以通过这个 Future 查询到这个异步操作的结果,并进行一些处理。比如在操作失败的时候抛出异常。但是 jdk 内置的 Future 的查询只能在某个时刻手动去查询结果,或者直接阻塞这个异步操作,直到异步完成操作之后可以查询 Future 的成功或者失败。

ChannelFuture:Netty 内部提供的 Future 实现类,很多异步操作在执行的时候都会返回一个 ChannelFuture 对象,我们可以针对这个 ChannelFuture 对象设置一些回调函数,比如重写 operationComplete() 方法,这样这个异步事件在完成的时候会自动调用这个方法,并且执行我们自己的处理逻辑。

接下来可以看一下 ChannelFuture 的应用实例,检测 Netty 服务器链接远程地址是否成功:

Channel channel = "";
// 链接地址 192.168.100.113 的 7000 端口
InetSocketAddress socketAddress = new InetSocketAddress("192.168.100.113",7000);
// 管道绑定地址并返回一个 ChannelFuture
ChannelFuture channelFuture = channel.connect(socketAddress);
// 给 ChannelFuture 设置完成回调,判断这个操作是否完成
channelFuture.addListener(new ChannelFutureListener(){
		@override
		public void operationComplete(ChannelFuture future){if(future.isSucess()){
				// 创建一个字符串,并指定所使用的字符集,下面这种写法是 Netty 中经常遇到的
				ByteBuf buffer = Unpooled.copiedBuffer("Hello",Charset.defaultCharset());
				// 发送信息并且返回一个新的 writeFuture,依旧可以根据这个 writeFuture 处理一些逻辑
				ChannelFuture writeFuture = future.channel().writeAndFlush(buffer);
			}else{
				// 链接失败则答应出失败的消息
				Throwable cause = future.cause();
				cause.printStackTrace();}
		}
})
五、总结

Netty 以一种异步事件驱动以及回调的方式,能帮我们快速完善服务器处理数据的进出,以及各个流程细节中的处理逻辑。极大的精简了服务器开发人员在,链接处理,数据出入方面的开发工作。是一个及其易用且稳定的网络开发框架。

到此这篇关于 Java 游戏服务器系列之 Netty 相关知识总结的文章就介绍到这了

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计2488字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中