iohao / ioGame

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

[core] - 增加范围内的广播接口 RangeBroadcaster,业务参数支持基础类型(协议碎片)的简化使用 #294

Closed iohao closed 6 months ago

iohao commented 6 months ago

新增功能的使用场景

简化协议碎片的使用,将提供多个重载

long userId = ...
// example 
RangeBroadcaster.of(flowContext)
        // 需要广播的数据
        .setResponseMessage(cmdInfo, LongValue.of(userId))
        // 添加需要接收广播的用户
        .addUserId(1)
        // 执行广播
        .execute();

// example 简化后的业务参数后,不需要开发者显示的使用协议碎片包装类
// 业务参数可以直接使用 long 类型
RangeBroadcaster.of(flowContext)
        // 需要广播的数据
        .setResponseMessage(cmdInfo, userId)
        // 添加需要接收广播的用户
        .addUserId(1)
        // 执行广播
        .execute();

相关文档 - 解决协议碎片 (yuque.com)

iohao commented 6 months ago
iohao commented 6 months ago

相关文档 - 解决协议碎片 (yuque.com)

广播:单个、List,伪代码如下

public void testRangeBroadcaster(FlowContext flowContext) {
    // ------------ object ------------
    // 广播 object
    DemoBroadcastMessage message = new DemoBroadcastMessage();
    message.msg = "helloBroadcast --- 1";
    RangeBroadcaster.of(flowContext)
            .setResponseMessage(cmdInfo, message);
    // 广播 object list
    List<DemoBroadcastMessage> messageList = List.of(message);
    RangeBroadcaster.of(flowContext)
            .setResponseMessageList(cmdInfo, messageList);

    // ------------ int ------------
    // 广播 int
    int intValue = 1;
    RangeBroadcaster.of(flowContext)
            .setResponseMessage(cmdInfo, intValue);
    // 广播 int list
    List<Integer> intValueList = List.of(1, 2);
    RangeBroadcaster.of(flowContext)
            .setResponseMessageIntList(cmdInfo, intValueList);

    // ------------ long ------------
    // 广播 long
    long longValue = 1L;
    RangeBroadcaster.of(flowContext)
            .setResponseMessage(cmdInfo, longValue);
    // 广播 long list
    List<Long> longValueList = List.of(1L, 2L);
    RangeBroadcaster.of(flowContext)
            .setResponseMessageLongList(cmdInfo, longValueList);

    // ------------ String ------------
    // 广播 String
    String stringValue = "1";
    RangeBroadcaster.of(flowContext)
            .setResponseMessage(cmdInfo, stringValue);
    // 广播 String list
    List<String> stringValueList = List.of("1L", "2L");
    RangeBroadcaster.of(flowContext)
            .setResponseMessageStringList(cmdInfo, stringValueList);

    // ------------ boolean ------------
    // 广播 boolean
    boolean boolValue = true;
    RangeBroadcaster.of(flowContext)
            .setResponseMessage(cmdInfo, boolValue);
    // 广播 boolean list
    List<Boolean> boolValueList = List.of(true, false);
    RangeBroadcaster.of(flowContext)
            .setResponseMessageBoolList(cmdInfo, boolValueList);
}
molin7596 commented 6 months ago

那请问 新增这个范围内广播功能之后, BroadcastContext broadcastContext = BrokerClientHelper.getBroadcastContext(); 支持自动装箱/拆箱吗

iohao commented 6 months ago

那请问 新增这个范围内广播功能之后, BroadcastContext broadcastContext = BrokerClientHelper.getBroadcastContext(); 支持自动装箱/拆箱吗

不会,BroadcastContext 是基础接口,不做更多额外的操作。如有需要,开发者可以自行封装一层。

这里的 RangeBroadcast 就相当是封装了一层,内部用的还是 BroadcastContext。