iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;

Home Page:http://game.iohao.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

心跳响应前的回调

iohao opened this issue · comments

有某些业务中,开发者想在心跳消息中加入一些业务数据,比如当前系统时间。

在 ioGame21 中,将对 IdleHook 接口增加 pongBefore 方法,方便开发者对心跳消息的扩展。

public interface IdleHook<IdleEvent> {
    /**
     * 心跳事件回调
     * <pre>
     *     这里只需要做你的业务就可以了,比如通知房间内的其他玩家,该用户下线了。
     * </pre>
     *
     * @param userSession userSession
     * @param event       event
     * @return true 断开玩家连接
     */
    boolean callback(UserSession userSession, IdleEvent event);

    /**
     * 心跳响应前的回调
     * <pre>
     *     开发者可以给心跳消息添加一些额外信息,比如当前时间之类的。
     * </pre>
     *
     * @param idleMessage 心跳消息
     */
    default void pongBefore(BarMessage idleMessage) {

    }
}

扩展当前时间示例

在心跳消息响应前,把当前时间设置到响应中。

除了设置时间外,开发者可以将任意数据设置到 data 中。BarMessage.data 对应的是 ExternalMessage.data。

public final class MyIdleHook implements SocketIdleHook {
    ... ... 省略部分代码
    @Override
    public void pongBefore(BarMessage idleMessage) {
        // 把当前时间戳给到心跳接收端
        LongValue data = LongValue.of(TimeKit.currentTimeMillis());
        idleMessage.setData(data);
    }
}