iohao / ioGame

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

同一次连接UserIdSettingKit.settingUserId是否可以设置多次?后续设置是否可以覆盖掉之前的设置? #149

Closed dongnanxibei2023 closed 1 year ago

dongnanxibei2023 commented 1 year ago

如果已经设置了值, 后续想修改UserIdSettingKit.settingUserId中的userId值,正确的操作应该怎样做呢?

目前两个方案都不可行 1.使用ExternalCommunicationKit.forcedOffline(temporaryUserId);断开之前的连接再右客户端自动连接 2.不断开之前的连接,服务端直接重新UserIdSettingKit.settingUserId

都会报session为null

iohao commented 1 year ago

如果已经设置了值, 后续想修改UserIdSettingKit.settingUserId中的userId值,正确的操作应该怎样做呢?

目前使用ExternalCommunicationKit.forcedOffline(temporaryUserId);断开之前的连接再自动连接会报错

UserIdSettingKit.settingUserId 可以重复使用, settingUserId 在本质上只是为了给用户的长连接添加一个唯一标记。

iohao commented 1 year ago

如果已经设置了值, 后续想修改UserIdSettingKit.settingUserId中的userId值,正确的操作应该怎样做呢? 目前使用ExternalCommunicationKit.forcedOffline(temporaryUserId);断开之前的连接再自动连接会报错

UserIdSettingKit.settingUserId 可以重复使用, settingUserId 在本质上只是为了给用户的长连接添加一个唯一标记。

说错了,后续的不能覆盖之前的,也不能重复使用。

iohao commented 1 year ago

因为在 SettingUserIdMessageExternalProcessor 中做了限制。

dongnanxibei2023 commented 1 year ago

请问可以修改一下这个设置吗?

如果需要给用户添加一个默认的试玩游戏账号,再由客户自行注册账号进行游戏。 目前这样只能有两个替代方案, 1.登陆后由客户端断开websocket连接再连接 2.不使用UserIdSettingKit.settingUserId,使用token替代。 但是感觉都不太优雅。

或者作者有没有好的建议呢?

iohao commented 1 year ago

请问可以修改一下这个设置吗?

如果需要给用户添加一个默认的试玩游戏账号,再由客户自行注册账号进行游戏。 目前这样只能有两个替代方案, 1.登陆后由客户端断开websocket连接再连接 2.不使用UserIdSettingKit.settingUserId,使用token替代。 但是感觉都不太优雅。

或者作者有没有好的建议呢?

这是可扩展的。

flyshulk commented 1 year ago

遇到同样的问题。比如有多个角色做选择的情况下,想使用角色ID来做绑定设置,而不是userId。想不到好的方法优雅的解决这个问题。UserIdSettingKit.settingUserId这个方法的使用时间点。

iohao commented 1 year ago

遇到同样的问题。比如有多个角色做选择的情况下,想使用角色ID来做绑定设置,而不是userId。想不到好的方法优雅的解决这个问题。UserIdSettingKit.settingUserId这个方法的使用时间点。

如果是同一用户(玩家)下有多个角色,可以尝试使用元信息-附加信息 + FlowContext 的组合。

下面是参考代码

@ProtobufClass
@FieldDefaults(level = AccessLevel.PUBLIC)
public class MyAttachment implements Attachment {
    @Getter
    long userId;
    long userRoleId;
}

public class MyFlowContext extends FlowContext {
    public long getRoleId() {
        var attachment = this.getAttachment(MyAttachment.class);
        return attachment.userRoleId;
    }
}

在切换角色时,更改 MyAttachment.userRoleId 数据就行;总的来说,玩家还是那个玩家,只不过使用 userRoleId 来关联相关数据。