新增客戶端與伺服器互動訊息
阿新 • • 發佈:2021-02-13
技術標籤:遊戲伺服器單服框架實現遊戲伺服器開發netty網路通訊
新增客戶端與伺服器互動訊息
原始碼地址: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;
}
}
在上面的訊息中,有一個重要的註解:
@GameMessageMeta(messageType = 2, messageId = 10001)
註解是用來標記這個物件的一些元資料資訊,讓框架在物件沒有建立例項時,可以從物件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) 它標記的方法就是處理對應的客戶端請求訊息的方法
在伺服器端,只需要此兩步就可以實現訊息的處理,方便又簡單。