源码地址:https://gitee.com/wgslucky/xinyue-alone-game-server

    游戏服务器封装的一个重要功能就是方便添加客户端与服务器交互的消息,让业务开发者不需要关注网络底层的实现,只专注与自己的业务功能开发即可。那如何使用本框架添加交互消息呢?
    为了方便交互消息的管理,和多个项目对它的引用,在本框架中,将消息单独封装到一个maven项目中进行管理:game-network-messasges,下面以登陆消息为例

    1. 第一步,先在game-network-messages中添加要交互的消息对象,如下面代码所示: ```java //客户端请求信息对象 @GameMessageMeta(messageId = 10001, messageType = 1) public class LoginRequest implements IGameMessage { private String username; private String password;

      public String getUsername() {

      1. return username;

      }

      public void setUsername(String username) {

      1. this.username = username;

      }

      public String getPassword() {

      1. return password;

      }

      public void setPassword(String password) {

      1. this.password = password;

      } }

    //服务器响应返回信息对象 @GameMessageMeta(messageType = 2, messageId = 10001) public class LoginResponse implements IGameMessage { private int playId;

    1. public int getPlayId() {
    2. return playId;
    3. }
    4. public void setPlayId(int playId) {
    5. this.playId = playId;
    6. }

    }

    1. 在上面的消息中,有一个重要的注解:
    2. ```java
    3. @GameMessageMeta(messageType = 2, messageId = 10001)

    注解是用来标记这个对象的一些元数据信息,让框架在对象没有创建实例时,可以从对象class中获取一些信息。

    • messageId 表示此消息对象的消息号,它必须唯一,不能和其它消息重复。
    • messageType 表示此消息的类型:1 是请求消息,2 是服务器响应消息,3 是服务器push消息,即服务器主动请求客户端的消息。


    当然,后面有时间的话,可以开发一个协议生成工具,使用工具从协议定义中自动生成客户端与服务器交互的消息类

    1. 第二步,在服务端添加接收处理消息

    如何从网络层读取消息,在框架的底层已经做好了封装,业务开发人员不需要关心这个,只专注与自己的逻辑功能开发即可。即只需要知道从哪里接收客户端请求对象的数据对象即可。
    在框架的game-server项目的com.xinyue.game.server.gamehandler包中,直接添加处理的Handler即可。如下面代码所示:

    1. /**
    2. * @author 王广帅
    3. * @date 2021年01月26日 8:28 下午
    4. */
    5. @GameHandlerComponent
    6. public class LoginHandler extends AbstractGameHandler {
    7. @GameMapping(LoginRequest.class)
    8. public void login(GameChannelContext ctx, LoginRequest request) {
    9. LoginResponse response = new LoginResponse();
    10. response.setPlayId(1000);
    11. ctx.sendGameMessage(response);
    12. logger.debug("{} 登陆请求", request.getUsername());
    13. }
    14. }

    在上面的代码中,当有客户端的登陆请求消息过来时,框架层会直接调login方法,只需要在login方法中处理相关的登陆业务即可。在这里有两个重要的注解不能缺少,如果不添加这两个注解,框架层就找不到这个消息的处理方法了:

    • @GameHandlerComponent 它标记的类被认变是客户端消息类的处理者
    • @GameMapping(LoginRequest.class) 它标记的方法就是处理对应的客户端请求消息的方法

    在服务器端,只需要此两步就可以实现消息的处理,方便又简单。


    文章中插入的公众号关注.png