You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sponge Minecraft服务器注册MC|Brand通道报预留通道错误如何解决?

问题原因

org.spongepowered.api.network.ChannelRegistrationException: Reserved channels cannot be registered by plugins 异常的核心原因是MC|Brand属于Minecraft官方预留的内置通道,Sponge框架默认禁止第三方插件手动注册这类系统预留通道,因此直接调用getOrCreateRaw方法注册该通道会触发校验失败。

修复方案

不需要手动注册MC|Brand通道,Sponge已经内置了对应事件可以直接监听该通道的消息,有两种可选实现方式:

方案1:监听封装好的ClientBrandEvent(推荐)

Sponge已经对MC|Brand通道的消息做了开箱即用的封装,直接监听ClientBrandEvent即可拿到解析完成的客户端品牌信息,无需自己处理原始字节:

import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.network.ClientBrandEvent;
import org.spongepowered.api.entity.living.player.Player;

@Listener
public void onClientBrandReceive(ClientBrandEvent event) {
    Player targetPlayer = event.getTargetEntity();
    String clientBrand = event.getBrand(); // 已解析好的客户端品牌,如vanilla、forge、liteloader等
    // 你的业务逻辑
}

方案2:监听原始通道消息事件

如果你需要读取MC|Brand通道的原始字节数据做自定义处理,可以直接监听ChannelMessageEvent.Raw事件,过滤通道名即可,无需注册通道:

import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.network.ChannelMessageEvent;
import org.spongepowered.api.network.ConnectionSide;
import org.spongepowered.api.network.ChannelBuf;

@Listener
public void onRawBrandChannelMessage(ChannelMessageEvent.Raw event) {
    // 过滤只处理MC|Brand通道的客户端侧消息
    if (!"MC|Brand".equals(event.getChannel().getName()) || event.getConnection().getSide() != ConnectionSide.CLIENT) {
        return;
    }
    ChannelBuf rawData = event.getData();
    // MC|Brand通道数据格式为VarInt长度 + UTF-8编码的品牌字符串,可直接调用readString读取
    String brand = rawData.readString();
    // 你的业务逻辑
}

补充说明

不存在允许插件注册MC预留通道的方法,所有预留通道的消息都可以通过监听ChannelMessageEvent.Raw事件处理,其中常用的系统通道Sponge都封装了对应专用事件,直接使用即可。

内容的提问来源于stack exchange,提问作者Elikill58

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 03:00:02