Netty实战手册(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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来实现与客户端的通讯的,并且介绍一些框架中的使用方式。




猜你喜欢

转载自blog.csdn.net/aiyoyoyo/article/details/78673829