添加用戶端與伺服器互動消息
源碼位址:https://gitee.com/wgslucky/xinyue-alone-game-server
遊戲伺服器封裝的一個重要功能就是友善添加用戶端與伺服器互動的消息,讓業務開發者不需要關注網絡底層的實作,隻專注與自己的業務功能開發即可。那如何使用本架構添加互動消息呢?
為了友善互動消息的管理,和多個項目對它的引用,在本架構中,将消息單獨封裝到一個maven項目中進行管理:game-network-messasges,下面以登陸消息為例
- 第一步,先在game-network-messages中添加要互動的消息對象,如下面代碼所示:
//用戶端請求資訊對象
@GameMessageMeta(messageId = 10001, messageType = 1)
public class LoginRequest implements IGameMessage {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
//伺服器響應傳回資訊對象
@GameMessageMeta(messageType = 2, messageId = 10001)
public class LoginResponse implements IGameMessage {
private int playId;
public int getPlayId() {
return playId;
}
public void setPlayId(int playId) {
this.playId = playId;
}
}
在上面的消息中,有一個重要的注解:
注解是用來标記這個對象的一些中繼資料資訊,讓架構在對象沒有建立執行個體時,可以從對象class中擷取一些資訊。
- **messageId **表示此消息對象的消息号,它必須唯一,不能和其它消息重複。
- **messageType **表示此消息的類型:1 是請求消息,2 是伺服器響應消息,3 是伺服器push消息,即伺服器主動請求用戶端的消息。
當然,後面有時間的話,可以開發一個協定生成工具,使用工具從協定定義中自動生成用戶端與伺服器互動的消息類
- 第二步,在服務端添加接收處理消息
如何從網絡層讀取消息,在架構的底層已經做好了封裝,業務開發人員不需要關心這個,隻專注與自己的邏輯功能開發即可。即隻需要知道從哪裡接收用戶端請求對象的資料對象即可。
在架構的game-server項目的com.xinyue.game.server.gamehandler包中,直接添加處理的Handler即可。如下面代碼所示:
/**
* @author 王廣帥
* @date 2021年01月26日 8:28 下午
*/
@GameHandlerComponent
public class LoginHandler extends AbstractGameHandler {
@GameMapping(LoginRequest.class)
public void login(GameChannelContext ctx, LoginRequest request) {
LoginResponse response = new LoginResponse();
response.setPlayId(1000);
ctx.sendGameMessage(response);
logger.debug("{} 登陸請求", request.getUsername());
}
}
在上面的代碼中,當有用戶端的登陸請求消息過來時,架構層會直接調login方法,隻需要在login方法中處理相關的登陸業務即可。在這裡有兩個重要的注解不能缺少,如果不添加這兩個注解,架構層就找不到這個消息的處理方法了:
- @GameHandlerComponent 它标記的類被認變是用戶端消息類的處理者
- @GameMapping(LoginRequest.class) 它标記的方法就是處理對應的用戶端請求消息的方法
在伺服器端,隻需要此兩步就可以實作消息的處理,友善又簡單。
