版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aiyoyoyo/article/details/78673829
本篇主要讲述通过JSTS整合的Netty构建一个的游戏服务器结构,然后你可以在其中扩展你需要的内容。下面请跟随我将讲述JSTS的用法,其中你可以了解Netty和Spring的一些用法,并可以在项目中进行实践。
一、基础配置
首先,我们构建一个Maven项目,项目中引入一些基础内容:JSTS、junit、log4j,因为某些怨音,JSTS引入JTLS,JTLS使用了jdk1.8的特性。于是乎初始的pom.xml的关键节点如下:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties>
<!-- jees 依赖项 分为2个部分 --> <dependency> <groupId>com.jees</groupId> <artifactId>jees-jsts</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- log4j --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId> <version>2.9.1</version> </dependency>
二、服务器结构设计
作为游戏服务器,我们可以先设计几个内容的服务类:GameService、HandlerService、CommandService
GameServce作为程序的启动入口,负责启动应用。启动方式,上篇也介绍过,这里还是先贴出来:
@SuppressWarnings( "resource" )
public static void main( String[] args ) {
new ClassPathXmlApplicationContext( ICommonConfig.CFG_DEFAULT ) ;
((ISupportSocket) CommonContextHolder.getBean( ISupportSocket.SOCKET_SUPER ) ).onload();
}
HandlerService用于接收和处理Netty的客户端响应事件。ISupportHandler提供了针对Netty或者其他Socket框架的事件相应模型,初始的代码如下:
@Service
public class HandlerService implements ISupportHandler< ChannelHandlerContext , Object > , ICommonConfig {
@Override
public void receive( ChannelHandlerContext _ctx , Object _obj ) {
// TODO 收到消息触发
}
@Override
public void enter( ChannelHandlerContext _ctx ) {
// TODO 建立连接触发
}
@Override
public void leave( ChannelHandlerContext _ctx ) {
// TODO 连接断开触发
}
@Override
public void stand( ChannelHandlerContext _ctx ) {
// TODO 默认的心跳检测机制,超过1分钟未发生任何请求的客户端会触发
}
@Override
public void error( ChannelHandlerContext _ctx , Throwable _thr ) {
// TODO 当事件变化,或者客户端请求触发异常时,触发
}
}
CommandService处理客户端的请求命令。
@Service
public class CommandService implements ISupportCommand< ChannelHandlerContext , ByteBuf > {
@Override
public void docommand( ChannelHandlerContext _ctx , ByteBuf _buf ) {
}
}
其实CommandService仅仅是提供给给位参考的,主要用拆解来自客户端的各种消息,以及事件的处理。这部分可以根据各自的理解,自行实现。
客户端的模拟我就不写了,网上的例子太多。最后贴出Spring的核心内容和文件:
<!-- 基础配置部分 --> <util:properties id="defineConfig" location="define.properties" /> <context:property-placeholder properties-ref="defineConfig" ignore-unresolvable="true" /> <!-- 前置功能 --> <context:annotation-config /> <context:component-scan base-package="com.jees.core.socket.*" /> <!-- 使用Netty作为Socket服务器 --> <context:component-scan base-package="com.jees.jsts.netty.*" /> <context:component-scan base-package="com.jees.demo.service" />
define.properties 文件中仅定义了端口,后面可以把其他的内容定义放在这里。
socket.port1 = 1000
三、 结尾
到这里,一个最基本的Netty服务器模型就建立好了,贴出来的没有多余或者缺少的配置,是可以独立运行的列子。当然你可以改进和优化它。因为总体的思路比较简单,虽然我没有给出完整的代码,但依靠上面的内容,就可以独立运行了。
Netty没有想像中的复杂,对于服务器开发来说算得上是简单好用了。
下篇,我将介绍如何配合ISupportHandler来实现与客户端的通讯的,并且介绍一些框架中的使用方式。