Java游戏服务器系列之Netty相关知识总结

 更新时间:2021年05月24日 16:45:47   作者:张山大人  
今天带大家来学习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相关知识总结的文章就介绍到这了,更多相关Java Netty内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java语言通过三种方法实现队列的示例代码

    Java语言通过三种方法实现队列的示例代码

    这篇文章主要介绍了Java语言通过三种方法来实现队列的实例代码,数组模拟队列,通过对定义的了解,发现队列很像我们的数组,下面我们通过实践给大家详细介绍,需要的朋友可以参考下
    2022-02-02
  • 浅谈java反射和自定义注解的综合应用实例

    浅谈java反射和自定义注解的综合应用实例

    本篇文章主要介绍了java反射和自定义注解的综合应用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Java趣味练习题之输出两个日期之间的相隔天数

    Java趣味练习题之输出两个日期之间的相隔天数

    本篇文章介绍了我看到的一个趣味小题目,怎么求得两个日期之间相隔的天数,以及解决该题目的过程及思路,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-10-10
  • Java异常java.lang.UnsatisfiedLinkError: no opencv_java320 in java.library.path的解决

    Java异常java.lang.UnsatisfiedLinkError: no opencv_ja

    这篇文章主要介绍了Java异常java.lang.UnsatisfiedLinkError: no opencv_java320 in java.library.path的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java中JDK动态代理的超详细讲解

    Java中JDK动态代理的超详细讲解

    JDK 的动态代理是基于拦截器和反射来实现的,JDK代理是不需要第三方库支持的,只需要JDK环境就可以进行代理,下面这篇文章主要给大家介绍了关于Java中JDK动态代理的超详细讲解,需要的朋友可以参考下
    2022-10-10
  • Java实现多用户注册登录的幸运抽奖

    Java实现多用户注册登录的幸运抽奖

    这篇文章主要为大家详细介绍了Java实现多用户注册登录的幸运抽奖,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Java使用黑盒方式模拟实现内网穿透

    Java使用黑盒方式模拟实现内网穿透

    这篇文章主要介绍了Java使用黑盒方式模拟实现内网穿透,内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而正确路由到内网主机,需要的朋友可以参考下
    2023-05-05
  • SpringBoot中注解@AliasFor的使用详解

    SpringBoot中注解@AliasFor的使用详解

    这篇文章主要为大家详细介绍了SpringBoot中注解@AliasFor的用法,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2022-05-05
  • Java如何实现简单的RPC框架

    Java如何实现简单的RPC框架

    这篇文章主要介绍了Java如何实现简单的RPC框架,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Mybatis-Plus Wrapper条件构造器超详细使用教程

    Mybatis-Plus Wrapper条件构造器超详细使用教程

    接口方法的参数中,会出现各种 Wrapper,比如 queryWrapper、updateWrapper 等。Wrapper 的作用就是用于定义各种各样的条件(where)。所以不管是查询、更新、删除都会用到Wrapper
    2022-03-03

最新评论