Skip to main content

用户上下线钩子

介绍

框架提供了用户上线、下线时的钩子接口,开发者可以利用钩子接口做一些特殊的业务逻辑。 利用好该接口,可以把用户当前在线状态通知到逻辑服

  • 比如,下线时给逻辑服发送一个 action 来处理玩家下线时的业务逻辑。
  • 比如,两个玩家的在一个桌子上玩象棋,用户A 掉线了,可以自己实现一个通知给到用户B,把玩家A的头像设置为离线。

UserHook 是上线、下线时的钩子接口,提供了两个方法

  1. into : 用户登录成功后会触发。
  2. quit : 连接断开后会触发。

框架内置了一个默认的实现类 DefaultUserHook,只做了简单的打印。本篇我们学习如何扩展 UserHook 接口。

warning

需要登录后才会触发钩子接口。

Example Source Code

see https://github.com/iohao/ionet-examples

path : ionet-cookbook-code

  • MyUserHook
  • MyExternalServer

自定义 UserHook

现在我们自定义一个 MyUserHook,实现了 2 个接口,分别是

  • UserHook,用户上线、下线时的钩子接口
  • ExternalSettingAware,实现该接口后,框架会注入 ExternalSetting 对象。通过该对象我们可以获取 UserSessions、ConvenientCommunication。

代码说明

  • code 7,打印当前连接的 userId,统计当前对外服的用户数量。
  • code 15 ~ 16,用户下线时,会向逻辑服发送一个 action 请求,用于后续的离线业务处理。
  • code 21 ~ 22,设置 UserSessions 和用于通信的 ConvenientCommunication 对象。
public final class MyUserHook implements UserHook, ExternalSettingAware {
UserSessions<?, ?> userSessions;
ConvenientCommunication convenientCommunication;

@Override
public void into(UserSession userSession) {
log.info(getString(userSession, "online"));
}

@Override
public void quit(UserSession userSession) {
log.info(getString(userSession, "offline"));

// Send an offline message
var message = userSession.ofMessage(HallCmd.of(HallCmd.internalOffline));
this.convenientCommunication.request(message);
}

@Override
public void setExternalSetting(ExternalSetting setting) {
this.userSessions = setting.userSessions();
this.convenientCommunication = setting.convenientCommunication();
}

private String getString(UserSession userSession, String key) {
return """
%s:%s
userId:%s
userChannelId:%s
""".formatted(
key, this.userSessions.countOnline(),
userSession.getUserId(),
userSession.getUserChannelId());
}
}

设置 UserHook

设置自定义 MyUserHook 到对外服中。

public ExternalServerBuilder builder(int port, ExternalJoinEnum joinEnum) {
var builder = ExternalMapper.builder(port, joinEnum);
builder.setUserHook(new MyUserHook());
return builder;
}