用户上下线钩子
介绍
框架提供了用户上线、下线时的钩子接口,开发者可以利用钩子接口做一些特殊的业务逻辑。
利用好该接口,可以把用户当前在线状态通知到游戏逻辑服
- 比如,下线时给游戏逻辑服发送一个 action 来处理玩家下线时的业务逻辑。
- 比如,两个玩家的在一个桌子上玩象棋,玩家A 掉线了,可以自己实现一个通知给到玩家B,把玩家A的头像设置为离线。
如何使用
UserHook 是上线、下线时的钩子接口,提供了两个方法
- into : 用户登录成功后会触发。
- quit : 连接断开后会触发。
warning
需要登录后才会触发钩子接口。
框架内置了一个实现类 DefaultUserHook,只做了简单的打印。 下面是将 UserHook 设置到游戏对外服中。
void userHook(DefaultExternalCoreSetting setting) {
setting.setUserHook(new DefaultUserHook());
}
自定义 UserHook
现在我们自定义一个 DemoUserHook,实现了 3 个接口,分别是
- UserHook,用户上线、下线时的钩子接口
- UserSessionsAware,实现该接口后,框架会注入 UserSessions。
- BrokerClientAware,实现该接口后,框架会注入 BrokerClient。
代码说明
- code 7,获取当前连接的 userId,统计当前游戏游戏对外服的用户数量。
- code 13 ~ 15,用户下线时,将游戏逻辑服发送一个 action 请求,用于后续的业务处理。
public class DemoUserHook implements UserHook, UserSessionsAware, BrokerClientAware {
BrokerClient brokerClient;
UserSessions<?, ?> userSessions;
@Override
public void into(UserSession userSession) {
log.info("{} - {}", userSession.getUserId(), this.userSessions.countOnline());
}
@Override
public void quit(UserSession userSession) {
try {
var cmdInfo = CmdInfo.of(DemoCmdForHookRoom.cmd, DemoCmdForHookRoom.quitRoom);
RequestMessage request = userSession.ofRequestMessage(cmdInfo);
this.brokerClient.oneway(request);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
@Override
public void setUserSessions(UserSessions<?, ?> userSessions) {
this.userSessions = userSessions;
}
@Override
public void setBrokerClient(BrokerClient brokerClient) {
this.brokerClient = brokerClient;
}
}
设置 UserHook
设置自定义 DemoUserHook 到游戏对外服中。
ExternalServer createExternalServer(int port) {
DefaultExternalServerBuilder builder = DefaultExternalServer.newBuilder(port);
var setting = builder.setting();
setting.setUserHook(new DemoUserHook());
...
return builder.build();
}
Example Source Code
see https://github.com/iohao/ioGameExamples
path : SimpleExample/example/example-hook