今天带大家来学习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{@overridepublic 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(){@overridepublic 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详解相关推荐

  1. Java游戏服务器系列:传统的BIO(OIO)、NIO与Netty中的BIO(OIO)、NIO

    BIO .NIO .OIO BIO就是OIO,BIO是阻塞IO模型(Block-I/O) NIO是非阻塞IO模型(Non-Block I/O), 有人将NIO称作(New-I/O),所以也将BIO称之 ...

  2. Java并发编程系列之CyclicBarrier详解

    简介 jdk原文 A synchronization aid that allows a set of threads to all wait for each other to reach a co ...

  3. Java并发编程系列之Semaphore详解

    简单介绍 我们以饭店为例,假设饭店只有三个座位,一开始三个座位都是空的.这时如果同时来了三个客人,服务员人允许其中他们进去用餐,然后对外说暂无座位.后来的客人必须在门口等待,直到有客人离开.这时,如果 ...

  4. ioGame 网络游戏服务器框架 (java)、java游戏服务器、netty 集群分步式的网络游戏服务器

    ioGame 国内首个基于蚂蚁金服 SOFABolt 的 java 网络游戏服务器框架:无锁异步化.事件驱动的架构设计 通过 ioGame 可以很容易的搭建出一个集群无中心节点.有状态多进程的分步式游 ...

  5. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

  6. QQ炫舞手游显示进入服务器失败6,qq炫舞手游进不去怎么办 游戏进不去方法详解[多图]...

    qq炫舞手游是新出的游戏,在近期非常的火爆,不过有不少的玩家都有进不了游戏的情况,下面安族小编给大家介绍一下游戏进不去方法详解. qq炫舞手游玩不了解决方法 1.第一种方式就是内测还没有开启咯,所以玩 ...

  7. java游戏服务器开发之四--通讯框架netty

    前言, 说明 引入netty的pom <!-- netty --><dependency><groupId>io.netty</groupId>< ...

  8. Netty详解(持续更新中)

    Netty详解 1. Netty概述 1.1 Netty简介 1.2 原生NIO问题 1.3 Netty特点 1.4 Netty应用场景 1.3 Netty版本说明 2. Java IO模型 2.1 ...

  9. Java游戏服务器开发之概念扫盲

    入行缘由 在2017年我正式的从web转Java游戏服务器开发.那个时候机缘巧合的投了一家使用Java语言开发游戏服务器的企业,当时的老板还问我为什么从web转游戏开发.当时我的回答还是历历在目:我喜 ...

最新文章

  1. 在国企当程序员是什么体验?
  2. mysql 主键自增_mysql自增主键在大量删除后如何重新设置避免断层
  3. android设置时间widget,【Android】时间与日期Widget(DatePicker 与 TimePicker)
  4. C++读取文件,将文件内容读到string字符串里面
  5. zbb20180415 cs 1.6 half-life launcher已停止工作
  6. MediaPlayer 播放视频的方法
  7. 睡觉时钱被转走、开房信息被叫卖、数字货币被篡改,你的安全感,还在吗?...
  8. [转]数据中心网络虚拟化 隧道技术
  9. [Contest]2017 ACM/ICPC Asia Regional Shenyang Online(01 03 07 09 10 11待补)
  10. python中的多线程求值串行和并行_python多线程和多进程——python并行编程实验
  11. [java] JVM监控与调优
  12. AD18生成gerber文件IPC网表文件及坐标文件以及用CAM350读取gerber详细教程-免费版无积分
  13. 卡卡通小熊win7桌面主题+非主流win7主题下载
  14. ei加声调怎么加_微商怎么加好友找客源实操篇
  15. 快速了解 Log4j的日志级别
  16. 从零开始前端学习[26]:html5的一些常用标签,header,footer,section,aside,figure,figcaption,nav,artical,
  17. Windows启动过程详解
  18. 服务器自动更新不能关闭,Windows2008服务器如何关闭系统自动更新?
  19. Android Toast使用的简单小结
  20. CyanogenMod精简手记

热门文章

  1. CVPR 2020 | 给Deepfake 假脸做 X-Ray,新模型把换脸图打回原形
  2. 欠阿里云一分钱,会是什么样的后果...
  3. 清华学霸震撼演讲:“你可曾为学习拼尽全力?”
  4. mysqldump导入导出百万级数据解决方案
  5. pycharm 在ubuntu18.04 20.04以上保存在侧边栏的方法
  6. 动态多尺度图表达3D人体骨架运动,实现精准预测效果超SOTA
  7. 数据可视化:Matplotlib vs ggplot2
  8. 部署教程 | ResNet原理+PyTorch复现+ONNX+TensorRT int8量化部署
  9. APS:大型多模态室内摄像机定位系统
  10. Maven学习总结(四)——Maven核心概念