diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..333c1e9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +logs/ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..2ff4fa2 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..bd31594 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,18 @@ + + + + + mongo + true + true + com.dbschema.MongoJdbcDriver + mongodb://43.155.238.153:27017/test + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..ebffee3 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..2fea40e --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d917c34 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BaseModule/README.md b/BaseModule/README.md new file mode 100644 index 0000000..8b159d6 --- /dev/null +++ b/BaseModule/README.md @@ -0,0 +1,107 @@ +# BaseModule + +**公共运行时库**:被 `ServerModule` 与 `CrossModule` 依赖。包含 **Netty TCP 帧编解码**、**CmdRpc 分发管线**、**Proto 元数据注册表**、**Spring 命令扫描** 以及与跨服调用相关的 **`CrossRpcInvoker` 接口**。 + +本模块 **不是** 可执行 Spring Boot 应用;随区服或跨服进程一起加载。 + +## 网络分层(逻辑) + +```mermaid +flowchart TB + subgraph TCP["TCP 字节流"] + F["一帧: 4B length + body"] + end + subgraph Net["BaseModule / net & frame"] + D["LengthPrefixedProtobuf 解码"] + H["CmdRpcTcpFrameHandler"] + end + subgraph Cmd["BaseModule / cmd"] + CD["CmdRpcChannelDispatch"] + PR["ProtoRegistry → ProtoInfo"] + PC["ProtoCommandReflect 解析 CTS / newBuilder STC"] + DP["CmdRpcDispatch → GameCommand"] + end + F --> D --> H --> CD + CD --> PR + CD --> PC + CD --> DP +``` + +## 1. 帧格式:`LengthPrefixedProtobuf` + +- **编码**:`LengthPrefixedProtobuf.encodeMessage(alloc, CmdRpcEnvelope)` — 先写 **大端 int32 长度**,再写 `CmdRpcEnvelope.toByteArray()`。 +- **解码**:`newTcpFrameDecoder()` 返回 Netty 解码器,攒满一帧后向 pipeline 下游抛出 **一条 ByteBuf(仅 body)**。 + +这样 **区服客户端 TCP** 与 **跨服 TCP** 与 **区服连跨服的 Outbound** 三者 **帧格式一致**,仅 IP/端口与 `CommandSource` 不同。 + +## 2. 入站处理:`CmdRpcTcpFrameHandler` + +- 读取一帧 `byte[]`,调用 **`CmdRpcChannelDispatch.dispatch(...)`**。 +- 将返回的 **`CmdRpcEnvelope`** 再次 **长度前缀编码** 写回对端。 +- `linkSource` 由构造时注入:`Client_TCP`(区服接客户端)或 `CROSS_TCP`(跨服接入站)。 + +**注意**:默认在 **Netty IO 线程** 上执行命令;若 `roundTrip` 同步调跨服会阻塞该连接上的 IO,Demo 场景可接受,生产需评估线程模型。 + +## 3. 分发核心:`CmdRpcChannelDispatch` + +步骤简述: + +1. `CmdRpcEnvelope.parseFrom(raw)`。 +2. `protoRegistry.resolve(linkSource, serviceId, methodId)` → 可选的 **`ProtoInfo`**。 +3. 若存在 `ProtoInfo`:**解析 payload 为 CTS**、**创建 STC 的 `Builder`**(网络层职责,命令内只填字段)。 +4. 构造 **`CommandContext`**(含 `ChannelHandlerContext`、`CrossRpcInvoker`、解码结果等)。 +5. **`CmdRpcDispatch.dispatchEnvelope(in, lookup, cctx)`** → 执行具体 **`GameCommand`**。 + +```mermaid +flowchart LR + IN[CmdRpcEnvelope in] + PI{ProtoInfo 存在?} + DEC[解码 CTS + STC Builder] + RAW[decoded=null 由命令自处理] + EXE[GameCommand.execute] + OUT[CmdRpcEnvelope out] + IN --> PI + PI -->|是| DEC --> EXE + PI -->|否| RAW --> EXE + EXE --> OUT +``` + +## 4. 命令模型 + +| 类型 | 说明 | +|------|------| +| `GameCommand` | `execute(CommandContext, CmdRpcEnvelope)`,完全自控 payload。 | +| `AbstractTypedPbCommand` | 依赖 `ProtoInfo`;`run(ctx, cts, stcBuilder)`;回包信封 **复制** `service/method/cross_ret/link_seq`。 | + +### `CommandSource` 与注册 + +- `@Cmd(source, serviceId, methodId)` 标注在命令类上。 +- **`SpringGameCommandRegistry`**:按 Spring 容器里 `GameCommand` Bean 扫描,**只收录** `source` 属于当前进程配置集合的命令(区服只收 `Client_TCP`,跨服只收 `CROSS_TCP`)。 + +## 5. `ProtoRegistry` 与自动注册 + +- **`ProtoRegistry`**:`register(ProtoInfo)` / `resolve(source, serviceId, methodId)`。 +- **`ProtoRegistryAutoConfigurer`**(`SmartInitializingSingleton`):扫描带 `@Cmd` 的 `GameCommand`,若继承 **`AbstractTypedPbCommand`**,则从泛型推断 **CTS / STC 类型** 并注册 **`ProtoInfo`**。 +- **未** 继承强类型基类的命令(如路径 3 中继)**不注册** `ProtoInfo`,由命令自行处理 payload。 + +## 6. `CrossRpcInvoker` + +- 接口方法:`CmdRpcEnvelope roundTrip(CmdRpcEnvelope request)`。 +- **ServerModule** 中由 **`CrossTcpClient`** 实现:维护至跨服的 **长连接**、`link_seq` 多路复用、注册与心跳。 + +区服业务命令(路径 2/3)通过 **`CommandContext.crossRpc()`** 拿到该实例,向跨服发 **`CrossForward*`** 对应的信封。 + +## 7. 依赖说明 + +- **Spring Context**(`@Component` 等)、**Netty**、**protobuf-java**、**slf4j-api**、**Lombok**(可选)。 +- 生成的 proto Java 类来自 **ProtoBufModule**。 + +## 包结构(主要) + +```text +com.huangzj.base +├── cmd # 分发、上下文、注册表、Proto 反射、CrossRpcInvoker +├── frame # 长度前缀、Buf 工具 +├── net # CmdRpcTcpFrameHandler +└── spring # SpringGameCommandRegistry、其它 Spring 辅助 +``` diff --git a/BaseModule/pom.xml b/BaseModule/pom.xml new file mode 100644 index 0000000..7c1ea1d --- /dev/null +++ b/BaseModule/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + + huangzj + comm-framework + 0.0.1-SNAPSHOT + ../pom.xml + + + BaseModule + jar + BaseModule + + + + huangzj + ProtoBufModule + ${project.version} + + + io.netty + netty-buffer + + + io.netty + netty-codec + + + com.google.protobuf + protobuf-java + ${protobuf.version} + + + org.springframework + spring-context + + + org.slf4j + slf4j-api + + + org.projectlombok + lombok + true + + + diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/AbstractTypedPbCommand.java b/BaseModule/src/main/java/com/huangzj/base/cmd/AbstractTypedPbCommand.java new file mode 100644 index 0000000..f8fa95e --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/AbstractTypedPbCommand.java @@ -0,0 +1,37 @@ +package com.huangzj.base.cmd; + +import com.huangzj.cmd.gen.CmdRpcEnvelope; +import com.google.protobuf.Message; +import org.springframework.util.ClassUtils; + +/** + * 强类型 PB 命令:CTS/STC 由 {@link ProtoRegistryAutoConfigurer} 根据本类泛型与 {@link Cmd} 自动注册为 + * {@link ProtoInfo};网络层解析请求并创建 {@link CommandContext#responseBuilder()},子类只实现 {@link #run}。 + */ +public abstract class AbstractTypedPbCommand implements GameCommand { + + @Override + public CmdRpcEnvelope execute(CommandContext ctx, CmdRpcEnvelope request) throws Exception { + if (ctx.protoInfo() == null || ctx.decodedRequest() == null || ctx.responseBuilder() == null) { + throw new IllegalStateException( + "缺少 ProtoInfo 或网络层未解码: " + + ClassUtils.getUserClass(getClass()).getName() + + ",请确认本类带 @Cmd 且继承 AbstractTypedPbCommand 以自动注册 ProtoInfo"); + } + @SuppressWarnings("unchecked") + C cts = (C) ctx.decodedRequest(); + @SuppressWarnings("unchecked") + B stcBuilder = (B) ctx.responseBuilder(); + run(ctx, cts, stcBuilder); + // CmdRpcEnvelope头原样带回:保证请求方(含区服↔跨服 link_seq)能把响应与请求对齐 + return CmdRpcEnvelope.newBuilder() + .setServiceId(request.getServiceId()) + .setMethodId(request.getMethodId()) + .setCrossRet(request.getCrossRet()) + .setLinkSeq(request.getLinkSeq()) + .setPayload(stcBuilder.build().toByteString()) + .build(); + } + + protected abstract void run(CommandContext ctx, C cts, B stcBuilder) throws Exception; +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/Cmd.java b/BaseModule/src/main/java/com/huangzj/base/cmd/Cmd.java new file mode 100644 index 0000000..a78d806 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/Cmd.java @@ -0,0 +1,25 @@ +package com.huangzj.base.cmd; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标在具体的 {@link GameCommand} 实现上,Spring 扫 Bean 时按来源 + service/method 归组。 + * {@code serviceId} / {@code methodId} 请使用 {@link com.huangzj.cmd.gen.PbService} 与各 {@code ServiceN_Method} + * 生成的 {@code *_VALUE} 常量,勿写裸数字。 + * CTS/STC 在 {@link ProtoRegistry} 中通过 {@link ProtoInfo} 注册,须与本注解一致。 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Cmd { + + CommandSource source(); + + /** 对应 {@link com.huangzj.cmd.gen.PbService} 的 wire 值,如 {@code PbService.Service_1_VALUE}。 */ + int serviceId(); + + /** 对应具体 {@code ServiceN_Method} 的 wire 值,如 {@code Service1_Method.Method1_VALUE}。 */ + int methodId(); +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/CmdRpcChannelDispatch.java b/BaseModule/src/main/java/com/huangzj/base/cmd/CmdRpcChannelDispatch.java new file mode 100644 index 0000000..122d59d --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/CmdRpcChannelDispatch.java @@ -0,0 +1,54 @@ +package com.huangzj.base.cmd; + +import com.huangzj.cmd.gen.CmdRpcEnvelope; +import com.google.protobuf.Message; +import io.netty.channel.ChannelHandlerContext; +import lombok.extern.slf4j.Slf4j; + +/** + * Netty 入站:先解析CmdRpcEnvelope,再按 {@link ProtoRegistry} 取 {@link ProtoInfo} 做 CTS 解码与 STC Builder 创建(网络层职责), + * 最后交给 {@link CmdRpcDispatch}。 + */ +@Slf4j +public final class CmdRpcChannelDispatch { + + private CmdRpcChannelDispatch() { + } + + /** + * @param linkSource 当前链路(客户端 TCP / 跨服 TCP),与注册表 {@link ProtoInfo#source()} 一致 + * @param protoRegistry PB 元数据表,在应用启动时完成注册 + */ + public static CmdRpcEnvelope dispatch( + byte[] raw, + GameCommandLookup lookup, + ChannelHandlerContext ctx, + CrossRpcInvoker crossRpc, + CommandSource linkSource, + ProtoRegistry protoRegistry) + throws Exception { + CmdRpcEnvelope in = CmdRpcEnvelope.parseFrom(raw); + // 同一套 service/method,在 Client_TCP 与 CROSS_TCP 可对应不同 ProtoInfo(来源隔离) + ProtoInfo protoInfo = protoRegistry.resolve(linkSource, in.getServiceId(), in.getMethodId()); + if (log.isDebugEnabled()) { + log.debug( + "CmdRpc inbound source={} remote={} service={} method={} protoInfo={}", + linkSource, + ctx.channel().remoteAddress(), + in.getServiceId(), + in.getMethodId(), + protoInfo != null); + } + Message decoded = null; + Message.Builder responseBuilder = null; + if (protoInfo != null) { + // 强类型命令:网络层负责 bytes→CTS、预创建 STC Builder,命令里只填字段 + decoded = ProtoCommandReflect.parser(protoInfo.ctsClass()).parseFrom(in.getPayload()); + responseBuilder = ProtoCommandReflect.builderSupplier(protoInfo.stcClass()).get(); + } + // protoInfo==null 时(如纯中继)由具体 GameCommand 自行解析 payload / 组包 + CommandContext cctx = + new CommandContext(ctx, crossRpc, in.getCrossRet(), protoInfo, decoded, responseBuilder); + return CmdRpcDispatch.dispatchEnvelope(in, lookup, cctx); + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/CmdRpcDispatch.java b/BaseModule/src/main/java/com/huangzj/base/cmd/CmdRpcDispatch.java new file mode 100644 index 0000000..bcdd94b --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/CmdRpcDispatch.java @@ -0,0 +1,30 @@ +package com.huangzj.base.cmd; + +import com.huangzj.cmd.gen.CmdRpcEnvelope; + +/** + * 解析CmdRpcEnvelope、查表、执行,三步并一行,Netty handler 里少写点重复代码。 + */ +public final class CmdRpcDispatch { + + private CmdRpcDispatch() { + } + + /** + * 从原始字节起跳,适合 TCP 一帧读完再分发。 + */ + public static CmdRpcEnvelope dispatch(byte[] raw, GameCommandLookup lookup, CommandContext ctx) throws Exception { + CmdRpcEnvelope in = CmdRpcEnvelope.parseFrom(raw); + return dispatchEnvelope(in, lookup, ctx); + } + + /** + * 已经 parse 过CmdRpcEnvelope时用,避免重复解析;上下文里的 cross_ret 必须在这之前就算好。 + */ + public static CmdRpcEnvelope dispatchEnvelope(CmdRpcEnvelope in, GameCommandLookup lookup, CommandContext ctx) throws Exception { + // lookup 按「来源已过滤后的表」解析,故同一 service/method 在区服/跨服可绑定不同实现类 + GameCommand cmd = lookup.resolve(in.getServiceId(), in.getMethodId()); + // 异常若直接抛出,由上层 Netty handler 记录并关连接;此处不吞异常 + return cmd.execute(ctx, in); + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/CommandContext.java b/BaseModule/src/main/java/com/huangzj/base/cmd/CommandContext.java new file mode 100644 index 0000000..e0eff95 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/CommandContext.java @@ -0,0 +1,52 @@ +package com.huangzj.base.cmd; + +import com.google.protobuf.Message; +import io.netty.channel.ChannelHandlerContext; +import lombok.Getter; +import lombok.experimental.Accessors; + +/** + * 命令执行上下文:Netty、跨服调用器、CmdRpcEnvelope cross_ret,以及网络层根据 {@link ProtoInfo} 解析好的请求/响应 Builder。 + */ +@Getter +@Accessors(fluent = true) +public class CommandContext { + + private final ChannelHandlerContext channelHandlerContext; + private final CrossRpcInvoker crossRpc; + private final int crossReturnCode; + /** + * 本帧在 {@link ProtoRegistry} 中对应的元数据;未注册强类型协议时为 null。 + */ + private final ProtoInfo protoInfo; + /** + * 网络层已按 {@link ProtoInfo#ctsClass()} 解析出的请求体;无 ProtoInfo 时为 null。 + */ + private final Message decodedRequest; + /** + * 网络层按 {@link ProtoInfo#stcClass()} 创建的 STC Builder,业务填充后组包;无 ProtoInfo 时为 null。 + */ + private final Message.Builder responseBuilder; + + public CommandContext(ChannelHandlerContext channelHandlerContext, CrossRpcInvoker crossRpcInvoker) { + this(channelHandlerContext, crossRpcInvoker, 0, null, null, null); + } + + public CommandContext(ChannelHandlerContext channelHandlerContext, CrossRpcInvoker crossRpcInvoker, int crossReturnCode) { + this(channelHandlerContext, crossRpcInvoker, crossReturnCode, null, null, null); + } + + /** + * @param protoInfo 可为 null + * @param decodedRequest 与 protoInfo 成对;有 protoInfo 时通常非 null + * @param responseBuilder 与 protoInfo 成对;有 protoInfo 时通常非 null + */ + public CommandContext(ChannelHandlerContext channelHandlerContext, CrossRpcInvoker crossRpcInvoker, int crossReturnCode, ProtoInfo protoInfo, Message decodedRequest, Message.Builder responseBuilder) { + this.channelHandlerContext = channelHandlerContext; + this.crossRpc = crossRpcInvoker; + this.crossReturnCode = crossReturnCode; + this.protoInfo = protoInfo; + this.decodedRequest = decodedRequest; + this.responseBuilder = responseBuilder; + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/CommandSource.java b/BaseModule/src/main/java/com/huangzj/base/cmd/CommandSource.java new file mode 100644 index 0000000..4081ecb --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/CommandSource.java @@ -0,0 +1,28 @@ +package com.huangzj.base.cmd; + +import lombok.Getter; + +/** + * 命令从哪儿来:区服面向客户端的 TCP、或跨服进程上的 TCP。 + * {@code fromType} 若要与外部协议数字对齐,可直接使用。 + */ +@Getter +public enum CommandSource { + + /** 区服侧面向客户端的那条 Cmd/会话链路(名字历史遗留,别和 OSI 的 TCP 较真)。 */ + Client_TCP(1, "CLIENT_TCP"), + + /** 跨服机器上监听的 CmdRpc TCP。 */ + CROSS_TCP(2, "CROSS_TCP"); + + /** 若要和外部协议数字对齐,用这个。 */ + private final int fromType; + + /** 给人看的短名字,日志里用着方便。 */ + private final String fromTypeName; + + CommandSource(int fromType, String fromTypeName) { + this.fromType = fromType; + this.fromTypeName = fromTypeName; + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/CrossRpcInvoker.java b/BaseModule/src/main/java/com/huangzj/base/cmd/CrossRpcInvoker.java new file mode 100644 index 0000000..32dfe73 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/CrossRpcInvoker.java @@ -0,0 +1,14 @@ +package com.huangzj.base.cmd; + +import com.huangzj.cmd.gen.CmdRpcEnvelope; + +/** + * 区服侧想跟跨服聊一句时用的抽象,默认实现是 TCP 同步 roundTrip。 + */ +public interface CrossRpcInvoker { + + /** + * 发一帧过去、等一帧回来;实现里一般是 TCP 同步写读,超时或断线要抛异常。 + */ + CmdRpcEnvelope roundTrip(CmdRpcEnvelope request) throws Exception; +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/GameCommand.java b/BaseModule/src/main/java/com/huangzj/base/cmd/GameCommand.java new file mode 100644 index 0000000..fabea46 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/GameCommand.java @@ -0,0 +1,15 @@ +package com.huangzj.base.cmd; + +import com.huangzj.cmd.gen.CmdRpcEnvelope; + +/** + * 一条 CmdRpc 业务命令:入参出参都是CmdRpcEnvelope,具体 PB 在实现里自己拆。 + */ +public interface GameCommand { + + /** + * 处理一帧 RPC:request 里带好 service/method/payload,返回完整CmdRpcEnvelope(含 payload)。 + * 具体异常策略由上层 {@code CmdRpcDispatch} 决定是否包进CmdRpcEnvelope或断开连接。 + */ + CmdRpcEnvelope execute(CommandContext ctx, CmdRpcEnvelope request) throws Exception; +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/GameCommandLookup.java b/BaseModule/src/main/java/com/huangzj/base/cmd/GameCommandLookup.java new file mode 100644 index 0000000..61e0168 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/GameCommandLookup.java @@ -0,0 +1,9 @@ +package com.huangzj.base.cmd; + +/** + * 根据 serviceId + methodId 捞出一条命令,找不到就抛 IllegalArgumentException。 + */ +public interface GameCommandLookup { + + GameCommand resolve(int serviceId, int methodId); +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoCommandReflect.java b/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoCommandReflect.java new file mode 100644 index 0000000..3c57251 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoCommandReflect.java @@ -0,0 +1,60 @@ +package com.huangzj.base.cmd; + +import com.google.protobuf.Message; +import com.google.protobuf.Parser; +import java.lang.reflect.Method; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; + +/** + * 按 protobuf 生成类做 CTS 解析 / STC Builder 创建(类比原工程 {@code ProtoMgr.decode} / {@code getStcProtoMessageByCtsNo})。 + */ +final class ProtoCommandReflect { + + private static final ConcurrentHashMap, Parser> PARSERS = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap, Supplier> BUILDER_FACTORIES = + new ConcurrentHashMap<>(); + + private ProtoCommandReflect() { + } + + @SuppressWarnings("unchecked") + static Parser parser(Class ctsClass) { + return (Parser) PARSERS.computeIfAbsent(ctsClass, ProtoCommandReflect::loadParser); + } + + @SuppressWarnings("unchecked") + static Supplier builderSupplier(Class stcClass) { + return (Supplier) BUILDER_FACTORIES.computeIfAbsent(stcClass, ProtoCommandReflect::loadBuilderFactory); + } + + private static Parser loadParser(Class msgClass) { + try { + Method m = msgClass.getMethod("parser"); + return (Parser) m.invoke(null); + } catch (ReflectiveOperationException e) { + throw new IllegalStateException( + "CTS 须为 protobuf 生成类且含 public static Parser parser(): " + msgClass.getName(), e); + } + } + + private static Supplier loadBuilderFactory(Class msgClass) { + try { + Method m = msgClass.getMethod("newBuilder"); + Object probe = m.invoke(null); + if (!(probe instanceof Message.Builder)) { + throw new IllegalStateException("newBuilder 未返回 Message.Builder: " + msgClass.getName()); + } + } catch (ReflectiveOperationException e) { + throw new IllegalStateException( + "STC 须为 protobuf 生成类且含 public static Builder newBuilder(): " + msgClass.getName(), e); + } + return () -> { + try { + return (Message.Builder) msgClass.getMethod("newBuilder").invoke(null); + } catch (ReflectiveOperationException e) { + throw new IllegalStateException(e); + } + }; + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoInfo.java b/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoInfo.java new file mode 100644 index 0000000..a45c70d --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoInfo.java @@ -0,0 +1,14 @@ +package com.huangzj.base.cmd; + +import com.google.protobuf.Message; + +/** + * PB 接口注册时的元数据:与 {@link CommandSource} + service/method 绑定,供网络层取 CTS/STC 类型做解析。 + * (对齐原工程 {@code ProtoInfo + ProtoMgr.getProtoInfoByCode} 思路。) + */ +public record ProtoInfo( + CommandSource source, + int serviceId, + int methodId, + Class ctsClass, + Class stcClass) {} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoRegistry.java b/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoRegistry.java new file mode 100644 index 0000000..9da438c --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoRegistry.java @@ -0,0 +1,33 @@ +package com.huangzj.base.cmd; + +import org.springframework.stereotype.Component; + +import java.util.concurrent.ConcurrentHashMap; + +/** + * 全局 PB 命令表:按「链路 + service + method」注册 {@link ProtoInfo},网络层只查这里拿类型。 + */ +@Component +public class ProtoRegistry { + + private final ConcurrentHashMap byKey = new ConcurrentHashMap<>(); + + public void register(ProtoInfo info) { + String k = key(info.source(), info.serviceId(), info.methodId()); + ProtoInfo prev = byKey.putIfAbsent(k, info); + if (prev != null) { + throw new IllegalStateException("ProtoInfo 重复注册: " + k + " 已有 " + prev); + } + } + + /** + * 未注册时返回 null(例如纯透传、自定义解析的命令)。 + */ + public ProtoInfo resolve(CommandSource source, int serviceId, int methodId) { + return byKey.get(key(source, serviceId, methodId)); + } + + private static String key(CommandSource source, int serviceId, int methodId) { + return source.name() + ":" + serviceId + ":" + methodId; + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoRegistryAutoConfigurer.java b/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoRegistryAutoConfigurer.java new file mode 100644 index 0000000..75b45b6 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/ProtoRegistryAutoConfigurer.java @@ -0,0 +1,56 @@ +package com.huangzj.base.cmd; + +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.SmartInitializingSingleton; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; +import org.springframework.util.ClassUtils; + +/** + * 启动时扫描所有 {@link GameCommand} Bean:带 {@link Cmd} 且继承 {@link AbstractTypedPbCommand} 的, + * 根据注解中的 source/service/method 与泛型上的 CTS/STC 自动 {@link ProtoRegistry#register}。 + * 未继承强类型基类(如纯透传)的命令不注册,由网络层按无 {@link ProtoInfo} 处理。 + */ +@Slf4j +@Component +public class ProtoRegistryAutoConfigurer implements SmartInitializingSingleton { + + private final ApplicationContext applicationContext; + private final ProtoRegistry protoRegistry; + + public ProtoRegistryAutoConfigurer(ApplicationContext applicationContext, ProtoRegistry protoRegistry) { + this.applicationContext = applicationContext; + this.protoRegistry = protoRegistry; + } + + @Override + public void afterSingletonsInstantiated() { + Map beans = applicationContext.getBeansOfType(GameCommand.class); + AtomicInteger n = new AtomicInteger(); + for (GameCommand bean : beans.values()) { + Class userClass = ClassUtils.getUserClass(bean.getClass()); + Cmd cmd = userClass.getAnnotation(Cmd.class); + if (cmd == null) { + continue; + } + // 仅 AbstractTypedPbCommand 子类可解析泛型;GameCommand 裸实现(如路径3中继)不注册 ProtoInfo + TypedPbCommandReflect.resolveCtsStc(userClass) + .ifPresent(pair -> { + ProtoInfo info = + new ProtoInfo(cmd.source(), cmd.serviceId(), cmd.methodId(), pair.cts(), pair.stc()); + protoRegistry.register(info); + n.incrementAndGet(); + log.info( + "ProtoInfo registered: source={} service={} method={} cts={} stc={}", + cmd.source(), + cmd.serviceId(), + cmd.methodId(), + pair.cts().getSimpleName(), + pair.stc().getSimpleName()); + }); + } + log.info("ProtoRegistry auto-registration done, {} ProtoInfo bean(s)", n.get()); + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/cmd/TypedPbCommandReflect.java b/BaseModule/src/main/java/com/huangzj/base/cmd/TypedPbCommandReflect.java new file mode 100644 index 0000000..85f4255 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/cmd/TypedPbCommandReflect.java @@ -0,0 +1,64 @@ +package com.huangzj.base.cmd; + +import com.google.protobuf.Message; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import org.springframework.util.ClassUtils; + +/** + * 从继承 {@link AbstractTypedPbCommand} 的具体命令类上解析 CTS / STC 消息类型(第二泛参为 {@code Xxx.Builder} 时,STC 取 {@code Xxx})。 + */ +final class TypedPbCommandReflect { + + private TypedPbCommandReflect() {} + + record CtsStc(Class cts, Class stc) {} + + static java.util.Optional resolveCtsStc(Class commandClass) { + Class user = ClassUtils.getUserClass(commandClass); + ParameterizedType pt = findAbstractTypedSuper(user); + if (pt == null) { + // 非 AbstractTypedPbCommand 子类,或泛型在运行期被擦除到无法解析 + return java.util.Optional.empty(); + } + Type[] args = pt.getActualTypeArguments(); + if (args.length < 2) { + return java.util.Optional.empty(); + } + Class ctsClass = rawClass(args[0]); + Class builderOrSecond = rawClass(args[1]); + if (ctsClass == null + || builderOrSecond == null + || !Message.class.isAssignableFrom(ctsClass)) { + return java.util.Optional.empty(); + } + // Java PB 惯例:Message.Builder 为 Message 的静态内部类,外层即 STC 类型 + Class stcClass = builderOrSecond.getDeclaringClass(); + if (stcClass == null || !Message.class.isAssignableFrom(stcClass)) { + return java.util.Optional.empty(); + } + return java.util.Optional.of( + new CtsStc(ctsClass.asSubclass(Message.class), stcClass.asSubclass(Message.class))); + } + + private static ParameterizedType findAbstractTypedSuper(Class c) { + while (c != null && c != Object.class) { + Type t = c.getGenericSuperclass(); + if (t instanceof ParameterizedType p && p.getRawType() == AbstractTypedPbCommand.class) { + return p; + } + c = c.getSuperclass(); + } + return null; + } + + private static Class rawClass(Type t) { + if (t instanceof Class cl) { + return cl; + } + if (t instanceof ParameterizedType p && p.getRawType() instanceof Class cl) { + return cl; + } + return null; + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/frame/LengthPrefixedProtobuf.java b/BaseModule/src/main/java/com/huangzj/base/frame/LengthPrefixedProtobuf.java new file mode 100644 index 0000000..c045d94 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/frame/LengthPrefixedProtobuf.java @@ -0,0 +1,32 @@ +package com.huangzj.base.frame; + +import com.google.protobuf.MessageLite; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; + +/** + * TCP 上 4 字节长度 + protobuf body 的通用写法,跨服和区服客户端共用。 + */ +public final class LengthPrefixedProtobuf { + + /** 单帧上限,防止恶意大包把内存打爆。 */ + public static final int MAX_FRAME_LENGTH = 65536; + + private LengthPrefixedProtobuf() { + } + + /** 长度字段在开头 4 字节,剥离长度头后剩下纯 PB。 */ + public static LengthFieldBasedFrameDecoder newTcpFrameDecoder() { + return new LengthFieldBasedFrameDecoder(MAX_FRAME_LENGTH, 0, 4, 0, 4); + } + + /** 先发 4 字节小端长度,再发 body,和上面的 decoder 成对使用。 */ + public static ByteBuf encodeMessage(ByteBufAllocator alloc, MessageLite message) { + byte[] body = message.toByteArray(); + ByteBuf buf = alloc.buffer(4 + body.length); + buf.writeInt(body.length); + buf.writeBytes(body); + return buf; + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/frame/NettyBufUtil.java b/BaseModule/src/main/java/com/huangzj/base/frame/NettyBufUtil.java new file mode 100644 index 0000000..eecb116 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/frame/NettyBufUtil.java @@ -0,0 +1,20 @@ +package com.huangzj.base.frame; + +import io.netty.buffer.ByteBuf; + +/** + * 把 ByteBuf 里当前可读区间一次性拷成 byte[],handler 里少写两行样板代码。 + */ +public final class NettyBufUtil { + + private NettyBufUtil() { + } + + /** 读指针会跟着动,注意别重复读同一段。 */ + public static byte[] readReadableBytes(ByteBuf buf) { + int n = buf.readableBytes(); + byte[] raw = new byte[n]; + buf.readBytes(raw); + return raw; + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/module/AbsHostModule.java b/BaseModule/src/main/java/com/huangzj/base/module/AbsHostModule.java new file mode 100644 index 0000000..1a50d4b --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/module/AbsHostModule.java @@ -0,0 +1,16 @@ +package com.huangzj.base.module; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * 挂在某个宿主(一般是玩家或会话)上的模块基类,手里攥着宿主引用。 + * + * @param

宿主类型,demo 里是 {@link com.huangzj.server.module.DemoPlayerHost} + */ +@Getter +@RequiredArgsConstructor +public abstract class AbsHostModule

{ + + protected final P player; +} diff --git a/BaseModule/src/main/java/com/huangzj/base/module/GeneralModule.java b/BaseModule/src/main/java/com/huangzj/base/module/GeneralModule.java new file mode 100644 index 0000000..e0d3b33 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/module/GeneralModule.java @@ -0,0 +1,121 @@ +package com.huangzj.base.module; + +import lombok.Getter; +import lombok.Setter; + +/** + * 玩家侧逻辑模块的骨架:tick、存档、登录回调都先空着,子类按需填。 + * 和修仙那套 GeneralModule 思路类似,这里做了精简,只保留 demo 要用的钩子。 + */ +@Getter +@Setter +public abstract class GeneralModule

extends AbsHostModule

{ + + /** tick / 存盘时共用的锁,避免和业务线程打架(demo 里只用在 runTick)。 */ + protected final Object saveLockObj = new Object(); + + /** 是否有脏数据要同步,具体怎么用看业务。 */ + protected boolean needSync; + + /** 是否已经进入过登录后流程,占位字段。 */ + protected boolean enterAfterLogin; + + /** 为 true 时才会被 {@link com.huangzj.base.spring.module.PlayerModuleRegistry#runTickAll(long)} 扫到。 */ + private boolean enableTick; + + protected GeneralModule(P player) { + super(player); + } + + /** 标记需要同步,一般配合 syncChange 使用。 */ + public void setNeedSync() { + this.needSync = true; + } + + /** 同步做完了就清掉标记。 */ + public void finishSync() { + this.needSync = false; + } + + /** 当前模块归属的玩家 id,子类必须给出。 */ + public abstract long getPlayerId(); + + /** 拉档,默认 true 表示不用拦。 */ + public boolean loadData() { + return true; + } + + /** 拉档后的二次处理,默认放行。 */ + public boolean afterLoadData() { + return true; + } + + /** 存盘,子类可写 Mongo/Redis;默认啥也不干。 */ + public boolean saveData() { + return true; + } + + /** 把内存改动推到客户端或其它服,force 是否强推由子类解释。 */ + public void syncChange(boolean force) { + } + + /** 模块类型,默认就是具体类。 */ + public Class getModuleClass() { + return getClass(); + } + + /** 登录完成要下发的消息,占位。 */ + public void loginSendMsg(boolean isReconnect) { + } + + /** 登录后逻辑,占位。 */ + public void afterLogin(boolean isReconnect) { + } + + /** 下线清理,占位。 */ + public void offline() { + } + + /** 处理游戏内推送/内部消息,占位。 */ + public void handleGameMsg(Object msg) { + } + + /** 红点刷新,占位。 */ + public void refreshRedPoint() { + } + + /** 跨天/重置类逻辑,占位。 */ + public void dailyResetData() { + } + + /** 打开定时 tick,注册表只会调度 isEnableTick 为 true 的模块。 */ + public void enableTick() { + this.enableTick = true; + } + + /** 若要做精准调度可覆写;默认 0 表示「不承诺下次时间点」。 */ + public long calcNextTickAt() { + return 0L; + } + + /** + * 外层统一包一层锁和异常,真正的周期逻辑写在 {@link #tick(long)}。 + */ + public void runTick(long runAt) { + try { + synchronized (saveLockObj) { + tick(runAt); + } + } catch (Exception e) { + onTickError(e); + } + } + + /** 每个调度周期进来一次,子类写业务。 */ + protected void tick(long runAt) { + } + + /** tick 抛错时的钩子,默认吞掉,需要打日志或告警就覆写。 */ + protected void onTickError(Exception e) { + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/module/ModuleMetricsProvider.java b/BaseModule/src/main/java/com/huangzj/base/module/ModuleMetricsProvider.java new file mode 100644 index 0000000..dc6e4c1 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/module/ModuleMetricsProvider.java @@ -0,0 +1,15 @@ +package com.huangzj.base.module; + +import java.util.Collections; +import java.util.Map; + +/** + * 模块要是愿意暴露点计数器之类的,就实现这个;注册表拼 /module/info 时会 merge 进来。 + */ +public interface ModuleMetricsProvider { + + /** 默认啥指标也没有,子类按需 override。 */ + default Map metrics() { + return Collections.emptyMap(); + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/module/PlayerModule.java b/BaseModule/src/main/java/com/huangzj/base/module/PlayerModule.java new file mode 100644 index 0000000..ca0ac28 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/module/PlayerModule.java @@ -0,0 +1,17 @@ +package com.huangzj.base.module; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 标在 {@link GeneralModule} 上,数字越小越先跑 tick(只是 demo 约定,你可以按习惯改)。 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface PlayerModule { + + /** 排序用,默认 0;相同顺序时不保证谁先谁后。 */ + int order() default 0; +} diff --git a/BaseModule/src/main/java/com/huangzj/base/net/CmdRpcTcpFrameHandler.java b/BaseModule/src/main/java/com/huangzj/base/net/CmdRpcTcpFrameHandler.java new file mode 100644 index 0000000..fde828d --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/net/CmdRpcTcpFrameHandler.java @@ -0,0 +1,48 @@ +package com.huangzj.base.net; + +import com.huangzj.base.cmd.CmdRpcChannelDispatch; +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.base.cmd.CrossRpcInvoker; +import com.huangzj.base.cmd.GameCommandLookup; +import com.huangzj.base.cmd.ProtoRegistry; +import com.huangzj.base.frame.LengthPrefixedProtobuf; +import com.huangzj.base.frame.NettyBufUtil; +import com.huangzj.cmd.gen.CmdRpcEnvelope; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * 长度前缀剥掉后的一帧 = 整包 {@link CmdRpcEnvelope}:查 {@link ProtoRegistry} 解码并分发。 + */ +@Slf4j +@RequiredArgsConstructor +public class CmdRpcTcpFrameHandler extends SimpleChannelInboundHandler { + + private final GameCommandLookup lookup; + private final CrossRpcInvoker crossRpc; + private final CommandSource linkSource; + private final ProtoRegistry protoRegistry; + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + byte[] raw = NettyBufUtil.readReadableBytes(msg); + // 解码 + ProtoRegistry + GameCommand 执行在同一线程(默认 IO 线程),业务应避免长时间阻塞 + CmdRpcEnvelope out = + CmdRpcChannelDispatch.dispatch(raw, lookup, ctx, crossRpc, linkSource, protoRegistry); + ctx.writeAndFlush(LengthPrefixedProtobuf.encodeMessage(ctx.alloc(), out)); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + log.error( + "CmdRpc TCP handler error source={} remote={}", + linkSource, + ctx.channel().remoteAddress(), + cause); + // 半包解码器之上若已错乱,继续读无意义,直接断链让客户端重连 + ctx.close(); + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/spring/SpringGameCommandRegistry.java b/BaseModule/src/main/java/com/huangzj/base/spring/SpringGameCommandRegistry.java new file mode 100644 index 0000000..b08d7eb --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/spring/SpringGameCommandRegistry.java @@ -0,0 +1,55 @@ +package com.huangzj.base.spring; + +import com.huangzj.base.cmd.Cmd; +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.base.cmd.GameCommand; +import com.huangzj.base.cmd.GameCommandLookup; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import org.springframework.util.ClassUtils; + +/** + * 启动时把 Spring 容器里的 {@link GameCommand} 扫一遍,按 {@link Cmd} 过滤来源。 + * 当前 key 为 {@link Cmd#serviceId()} + {@link Cmd#methodId()}(与 {@link com.huangzj.cmd.gen.CmdRpcEnvelope} 一致)。 + */ +@Slf4j +public class SpringGameCommandRegistry implements GameCommandLookup { + + private final Map commands = new HashMap<>(); + + /** 只收某一种来源的命令。 */ + public SpringGameCommandRegistry(ApplicationContext applicationContext, CommandSource source) { + this(applicationContext, EnumSet.of(source)); + } + + /** 区服若收多种来源,用 Set 传多个 {@link CommandSource}。 */ + public SpringGameCommandRegistry(ApplicationContext applicationContext, Set sources) { + Map beans = applicationContext.getBeansOfType(GameCommand.class); + for (GameCommand cmd : beans.values()) { + Class userClass = ClassUtils.getUserClass(cmd); + Cmd meta = userClass.getAnnotation(Cmd.class); + // 同一 Bean 可能带 @Cmd(source=Client_TCP),在跨服进程扫描时会被 sources 过滤掉 + if (meta != null && sources.contains(meta.source())) { + commands.put(key(meta.serviceId(), meta.methodId()), cmd); + } + } + log.info("GameCommand registry sources={} size={} keys={}", sources, commands.size(), commands.keySet()); + } + + private static String key(int serviceId, int methodId) { + return ":" + serviceId + ":" + methodId; + } + + @Override + public GameCommand resolve(int serviceId, int methodId) { + GameCommand cmd = commands.get(key(serviceId, methodId)); + if (cmd == null) { + throw new IllegalArgumentException("unknown " + serviceId + "/" + methodId); + } + return cmd; + } +} diff --git a/BaseModule/src/main/java/com/huangzj/base/spring/module/PlayerModuleRegistry.java b/BaseModule/src/main/java/com/huangzj/base/spring/module/PlayerModuleRegistry.java new file mode 100644 index 0000000..0bdc946 --- /dev/null +++ b/BaseModule/src/main/java/com/huangzj/base/spring/module/PlayerModuleRegistry.java @@ -0,0 +1,85 @@ +package com.huangzj.base.spring.module; + +import com.huangzj.base.module.GeneralModule; +import com.huangzj.base.module.ModuleMetricsProvider; +import com.huangzj.base.module.PlayerModule; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * 把容器里所有 {@link GeneralModule} 捞出来排个序,统一 tick、save,顺便给 HTTP 一个快照。 + */ +@Component +public class PlayerModuleRegistry implements ApplicationContextAware { + + /** 排好序的模块列表,只在容器刷新时重建。 */ + private List> modules = List.of(); + + /** + * Spring 回调:收集所有 GeneralModule Bean,按 {@link PlayerModule#order()} 从小到大排。 + */ + @Override + @SuppressWarnings({"rawtypes", "unchecked"}) + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + Map raw = applicationContext.getBeansOfType(GeneralModule.class); + List> list = new ArrayList<>(); + for (GeneralModule m : raw.values()) { + list.add(m); + } + list.sort(Comparator.comparingInt(this::orderOf)); + modules = List.copyOf(list); + } + + /** 没标注解就当 0,和别的模块挤在一起。 */ + private int orderOf(GeneralModule module) { + PlayerModule ann = module.getClass().getAnnotation(PlayerModule.class); + return ann == null ? 0 : ann.order(); + } + + /** 当前快照,一般给调试或管理接口。 */ + public List> all() { + return modules; + } + + /** 对所有「开了 tick」的模块跑一遍。 */ + public void runTickAll(long runAt) { + for (GeneralModule module : modules) { + if (module.isEnableTick()) { + module.runTick(runAt); + } + } + } + + /** 依次存盘,谁失败谁自己处理,这里不中断链路。 */ + public void saveAll() { + for (GeneralModule module : modules) { + module.saveData(); + } + } + + /** + * 拼一份给人看的列表:类名、顺序、是否 tick,外加实现了 {@link ModuleMetricsProvider} 的指标。 + */ + public List> describeModules() { + List> rows = new ArrayList<>(); + for (GeneralModule module : modules) { + Map row = new LinkedHashMap<>(); + row.put("class", module.getClass().getSimpleName()); + PlayerModule ann = module.getClass().getAnnotation(PlayerModule.class); + row.put("order", ann == null ? 0 : ann.order()); + row.put("enableTick", module.isEnableTick()); + if (module instanceof ModuleMetricsProvider provider) { + row.putAll(provider.metrics()); + } + rows.add(row); + } + return rows; + } +} diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/AbstractTypedPbCommand.class b/BaseModule/target/classes/com/huangzj/base/cmd/AbstractTypedPbCommand.class new file mode 100644 index 0000000..8785c36 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/AbstractTypedPbCommand.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/Cmd.class b/BaseModule/target/classes/com/huangzj/base/cmd/Cmd.class new file mode 100644 index 0000000..10d2031 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/Cmd.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/CmdRpcChannelDispatch.class b/BaseModule/target/classes/com/huangzj/base/cmd/CmdRpcChannelDispatch.class new file mode 100644 index 0000000..9e43d0f Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/CmdRpcChannelDispatch.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/CmdRpcDispatch.class b/BaseModule/target/classes/com/huangzj/base/cmd/CmdRpcDispatch.class new file mode 100644 index 0000000..8cdf229 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/CmdRpcDispatch.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/CommandContext.class b/BaseModule/target/classes/com/huangzj/base/cmd/CommandContext.class new file mode 100644 index 0000000..f8b3189 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/CommandContext.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/CommandSource.class b/BaseModule/target/classes/com/huangzj/base/cmd/CommandSource.class new file mode 100644 index 0000000..a99b995 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/CommandSource.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/CrossRpcInvoker.class b/BaseModule/target/classes/com/huangzj/base/cmd/CrossRpcInvoker.class new file mode 100644 index 0000000..bec12fa Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/CrossRpcInvoker.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/GameCommand.class b/BaseModule/target/classes/com/huangzj/base/cmd/GameCommand.class new file mode 100644 index 0000000..3ee0780 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/GameCommand.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/GameCommandLookup.class b/BaseModule/target/classes/com/huangzj/base/cmd/GameCommandLookup.class new file mode 100644 index 0000000..ce50314 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/GameCommandLookup.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/ProtoCommandReflect.class b/BaseModule/target/classes/com/huangzj/base/cmd/ProtoCommandReflect.class new file mode 100644 index 0000000..da0de14 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/ProtoCommandReflect.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/ProtoInfo.class b/BaseModule/target/classes/com/huangzj/base/cmd/ProtoInfo.class new file mode 100644 index 0000000..4471480 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/ProtoInfo.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/ProtoRegistry.class b/BaseModule/target/classes/com/huangzj/base/cmd/ProtoRegistry.class new file mode 100644 index 0000000..6db7e1b Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/ProtoRegistry.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/ProtoRegistryAutoConfigurer.class b/BaseModule/target/classes/com/huangzj/base/cmd/ProtoRegistryAutoConfigurer.class new file mode 100644 index 0000000..3747acd Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/ProtoRegistryAutoConfigurer.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/TypedPbCommandReflect$CtsStc.class b/BaseModule/target/classes/com/huangzj/base/cmd/TypedPbCommandReflect$CtsStc.class new file mode 100644 index 0000000..51816ea Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/TypedPbCommandReflect$CtsStc.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/cmd/TypedPbCommandReflect.class b/BaseModule/target/classes/com/huangzj/base/cmd/TypedPbCommandReflect.class new file mode 100644 index 0000000..c8663cc Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/cmd/TypedPbCommandReflect.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/frame/LengthPrefixedProtobuf.class b/BaseModule/target/classes/com/huangzj/base/frame/LengthPrefixedProtobuf.class new file mode 100644 index 0000000..762c140 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/frame/LengthPrefixedProtobuf.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/frame/NettyBufUtil.class b/BaseModule/target/classes/com/huangzj/base/frame/NettyBufUtil.class new file mode 100644 index 0000000..af49a76 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/frame/NettyBufUtil.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/module/AbsHostModule.class b/BaseModule/target/classes/com/huangzj/base/module/AbsHostModule.class new file mode 100644 index 0000000..9cce419 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/module/AbsHostModule.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/module/GeneralModule.class b/BaseModule/target/classes/com/huangzj/base/module/GeneralModule.class new file mode 100644 index 0000000..603870b Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/module/GeneralModule.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/module/ModuleMetricsProvider.class b/BaseModule/target/classes/com/huangzj/base/module/ModuleMetricsProvider.class new file mode 100644 index 0000000..ba2d623 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/module/ModuleMetricsProvider.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/module/PlayerModule.class b/BaseModule/target/classes/com/huangzj/base/module/PlayerModule.class new file mode 100644 index 0000000..fb439de Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/module/PlayerModule.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/net/CmdRpcTcpFrameHandler.class b/BaseModule/target/classes/com/huangzj/base/net/CmdRpcTcpFrameHandler.class new file mode 100644 index 0000000..4ee0453 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/net/CmdRpcTcpFrameHandler.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/spring/SpringGameCommandRegistry.class b/BaseModule/target/classes/com/huangzj/base/spring/SpringGameCommandRegistry.class new file mode 100644 index 0000000..b423272 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/spring/SpringGameCommandRegistry.class differ diff --git a/BaseModule/target/classes/com/huangzj/base/spring/module/PlayerModuleRegistry.class b/BaseModule/target/classes/com/huangzj/base/spring/module/PlayerModuleRegistry.class new file mode 100644 index 0000000..cccb390 Binary files /dev/null and b/BaseModule/target/classes/com/huangzj/base/spring/module/PlayerModuleRegistry.class differ diff --git a/BaseModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/BaseModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..ae02547 --- /dev/null +++ b/BaseModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,17 @@ +com\huangzj\base\cmd\CmdRpcDispatch.class +com\huangzj\base\cmd\GameCommand.class +com\huangzj\base\module\PlayerModule.class +com\huangzj\base\module\ModuleMetricsProvider.class +com\huangzj\base\cmd\GameCommandLookup.class +com\huangzj\base\cmd\CrossRpcInvoker.class +com\huangzj\base\spring\SpringGameCommandRegistry.class +com\huangzj\base\frame\NettyBufUtil.class +com\huangzj\base\module\AbsHostModule.class +com\huangzj\base\cmd\CommandContext.class +com\huangzj\base\module\GeneralModule.class +com\huangzj\base\spring\module\PlayerModuleRegistry.class +com\huangzj\base\frame\LengthPrefixedProtobuf.class +com\huangzj\base\cmd\Cmd.class +com\huangzj\base\cmd\AbstractTypedPbCommand.class +com\huangzj\base\cmd\CommandSource.class +com\huangzj\base\cmd\AbstractCrossToGamePbCommand.class diff --git a/BaseModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/BaseModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..dc4c5dd --- /dev/null +++ b/BaseModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,17 @@ +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\AbstractTypedPbCommand.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\frame\LengthPrefixedProtobuf.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\CommandSource.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\module\GeneralModule.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\module\AbsHostModule.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\CommandContext.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\CmdRpcDispatch.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\Cmd.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\spring\module\PlayerModuleRegistry.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\AbstractCrossToGamePbCommand.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\module\ModuleMetricsProvider.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\CrossRpcInvoker.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\GameCommandLookup.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\spring\SpringGameCommandRegistry.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\module\PlayerModule.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\frame\NettyBufUtil.java +F:\coding\comm-framework\BaseModule\src\main\java\com\huangzj\base\cmd\GameCommand.java diff --git a/CrossModule/README.md b/CrossModule/README.md new file mode 100644 index 0000000..043b9e6 --- /dev/null +++ b/CrossModule/README.md @@ -0,0 +1,101 @@ +# CrossModule + +**跨服独立进程**:仅启动 **一个 CmdRpc TCP 服务**(默认 **9200**),处理来源为 **`CommandSource.CROSS_TCP`** 的命令。 +区服通过 **`CrossTcpClient`**(在 ServerModule)作为 **TCP 客户端** 连到本进程。 + +## 进程职责 + +| 职责 | 说明 | +|------|------| +| 监听 TCP | `CrossTcpServer` 在 `ApplicationReadyEvent` 后 `bind(cross.tcp.port)` | +| Pipeline | `CrossTcpChannelInitializer`:`LengthPrefixedProtobuf` 解码 + `CmdRpcTcpFrameHandler` | +| 命令路由 | `CrossGameCommandRegistry` 只注册 `@Cmd(source=CROSS_TCP)` 的 Bean | +| 链路安全(可选) | `CrossLinkAcceptProperties`:`cross.link.expected-token` 非空时校验注册 token | + +## 网络拓扑 + +```mermaid +flowchart LR + subgraph Zone["ServerModule"] + CC[CrossTcpClient] + end + subgraph Cross["CrossModule :9200"] + XT[CrossTcpServer] + PL[pipeline] + REG[CrossGameCommandRegistry] + end + CC <-->|单 TCP 长连接 长度前缀+CmdRpcEnvelope| XT + XT --> PL --> REG +``` + +## 入站 Pipeline(与 BaseModule 一致) + +```text +Socket + → LengthFieldBasedFrameDecoder(由 LengthPrefixedProtobuf 配置) + → CmdRpcTcpFrameHandler + → CmdRpcChannelDispatch(linkSource = CROSS_TCP) + → GameCommand.execute + → 编码响应帧写回 +``` + +跨服侧 **`CrossRpcInvoker` 传 `null`**:跨服命令里 **不应** 再同步 `roundTrip` 回调区服(Demo 未实现跨服主动调区服)。 + +## 已实现的 `CROSS_TCP` 命令 + +### 业务:Service_2 / Method2 + +- **`CrossForwardCommand`**(`AbstractTypedPbCommand`) + - 入参:`CrossForwardCts` + - 出参:`CrossForwardStc` + - Demo 逻辑:给 `trace` 加前缀并写入 `cross_time_ms`。 + +### 链路:Service_4(注册 / 心跳) + +| method | 命令类 | 作用 | +|--------|--------|------| +| Register | `CrossLinkRegisterCommand` | 校验 `server_id`、可选 `expected-token` | +| Heartbeat | `CrossLinkHeartbeatCommand` | 回显 `client_time_ms`,写入 `cross_time_ms` | + +```mermaid +sequenceDiagram + participant Z as 区服 CrossTcpClient + participant X as CrossModule + Z->>X: Service_4 Register + link_seq + CrossLinkRegisterCts + X-->>Z: 同 link_seq + CrossLinkRegisterStc(ok/message) + loop 每 heartbeat-interval-ms + Z->>X: Service_4 Heartbeat + link_seq + X-->>Z: CrossLinkHeartbeatStc + end + Z->>X: Service_2 Method2 + link_seq + CrossForwardCts + X-->>Z: CrossForwardStc +``` + +## 配置(`src/main/resources/application.yml`) + +```yaml +cross: + tcp: + port: 9200 # Netty 监听端口 + link: + expected-token: "" # 非空则须与区服 cross.token 一致 +app: + logging: + dir: logs/CrossModule +``` + +## 启动 + +主类:`com.huangzj.cross.CrossModuleApplication` + +建议 **先于区服** 启动,否则区服 `CrossTcpClient` 预热与心跳会失败(日志告警),待跨服起来后下次业务或心跳会重连。 + +## 日志 + +`logback-spring.xml`:控制台 + 按级别分文件(`info.log` / `error.log`),目录由 `app.logging.dir` 指定。 + +## 扩展跨服 RPC + +1. 在 **ProtoBufModule** 增加 `service/method` 与消息体。 +2. 在本模块新增 `@Cmd(source=CROSS_TCP, ...)` 的 `GameCommand` 或 `AbstractTypedPbCommand`。 +3. 若需强类型自动解码,使用 **`AbstractTypedPbCommand`**;启动时 **`ProtoRegistryAutoConfigurer`** 会为跨服进程注册对应 `ProtoInfo`。 diff --git a/CrossModule/pom.xml b/CrossModule/pom.xml new file mode 100644 index 0000000..c1765ae --- /dev/null +++ b/CrossModule/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + + huangzj + comm-framework + 0.0.1-SNAPSHOT + ../pom.xml + + + CrossModule + jar + CrossModule + + + + huangzj + ProtoBufModule + ${project.version} + + + huangzj + BaseModule + ${project.version} + + + org.springframework.boot + spring-boot-starter + + + io.netty + netty-all + + + org.projectlombok + lombok + true + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.huangzj.cross.CrossModuleApplication + + + + + diff --git a/CrossModule/src/main/java/com/huangzj/cross/CrossModuleApplication.java b/CrossModule/src/main/java/com/huangzj/cross/CrossModuleApplication.java new file mode 100644 index 0000000..793e30e --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/CrossModuleApplication.java @@ -0,0 +1,18 @@ +package com.huangzj.cross; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; + +/** + * 跨服独立进程:只起 TCP + 命令注册,记得先让它跑起来区服才能 proxy。 + */ +@SpringBootApplication(scanBasePackages = "com.huangzj") +@ConfigurationPropertiesScan(basePackages = "com.huangzj") +public class CrossModuleApplication { + + /** 轻量进程,一般先于区服启动。 */ + public static void main(String[] args) { + SpringApplication.run(CrossModuleApplication.class, args); + } +} diff --git a/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossForwardCommand.java b/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossForwardCommand.java new file mode 100644 index 0000000..ef46220 --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossForwardCommand.java @@ -0,0 +1,26 @@ +package com.huangzj.cross.cmd; + +import com.huangzj.base.cmd.AbstractTypedPbCommand; +import com.huangzj.base.cmd.Cmd; +import com.huangzj.base.cmd.CommandContext; +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.cmd.gen.CrossForwardCts; +import com.huangzj.cmd.gen.CrossForwardStc; +import com.huangzj.cmd.gen.PbService; +import com.huangzj.cmd.gen.Service2_Method; +import org.springframework.stereotype.Component; + +/** 跨服示例:{@link PbService#Service_2} + {@link Service2_Method#Method2}。 */ +@Component +@Cmd( + source = CommandSource.CROSS_TCP, + serviceId = PbService.Service_2_VALUE, + methodId = Service2_Method.Method2_VALUE) +public class CrossForwardCommand extends AbstractTypedPbCommand { + + @Override + protected void run(CommandContext ctx, CrossForwardCts cts, CrossForwardStc.Builder stcBuilder) { + // Demo:给 trace 加前缀便于区分「跨服加工」;生产可在此落库、转发其它服等 + stcBuilder.setTrace("cross:" + cts.getTrace()).setCrossTimeMs(System.currentTimeMillis()); + } +} diff --git a/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossGameCommandRegistry.java b/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossGameCommandRegistry.java new file mode 100644 index 0000000..1755d35 --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossGameCommandRegistry.java @@ -0,0 +1,18 @@ +package com.huangzj.cross.cmd; + +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.base.spring.SpringGameCommandRegistry; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +/** + * 跨服进程只认 {@link CommandSource#CROSS_TCP} 的命令,别的来源不会进这张表。 + */ +@Component +public class CrossGameCommandRegistry extends SpringGameCommandRegistry { + + /** 启动时扫 Bean,只收集带 {@code @Cmd(source=CROSS_TCP)} 的实现。 */ + public CrossGameCommandRegistry(ApplicationContext applicationContext) { + super(applicationContext, CommandSource.CROSS_TCP); + } +} diff --git a/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossLinkHeartbeatCommand.java b/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossLinkHeartbeatCommand.java new file mode 100644 index 0000000..c704062 --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossLinkHeartbeatCommand.java @@ -0,0 +1,26 @@ +package com.huangzj.cross.cmd; + +import com.huangzj.base.cmd.AbstractTypedPbCommand; +import com.huangzj.base.cmd.Cmd; +import com.huangzj.base.cmd.CommandContext; +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.cmd.gen.CrossLinkHeartbeatCts; +import com.huangzj.cmd.gen.CrossLinkHeartbeatStc; +import com.huangzj.cmd.gen.PbService; +import com.huangzj.cmd.gen.Service4_Method; +import org.springframework.stereotype.Component; + +/** 区服 ↔ 跨服长连接心跳(仅 {@link CommandSource#CROSS_TCP})。 */ +@Component +@Cmd( + source = CommandSource.CROSS_TCP, + serviceId = PbService.Service_4_VALUE, + methodId = Service4_Method.Heartbeat_VALUE) +public class CrossLinkHeartbeatCommand extends AbstractTypedPbCommand { + + @Override + protected void run(CommandContext ctx, CrossLinkHeartbeatCts cts, CrossLinkHeartbeatStc.Builder stcBuilder) { + // 原样回显客户端时间,便于区服侧算 RTT;cross_time_ms 为跨服处理时刻 + stcBuilder.setClientTimeMs(cts.getClientTimeMs()).setCrossTimeMs(System.currentTimeMillis()); + } +} diff --git a/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossLinkRegisterCommand.java b/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossLinkRegisterCommand.java new file mode 100644 index 0000000..79e54c2 --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/cmd/CrossLinkRegisterCommand.java @@ -0,0 +1,44 @@ +package com.huangzj.cross.cmd; + +import com.huangzj.base.cmd.AbstractTypedPbCommand; +import com.huangzj.base.cmd.Cmd; +import com.huangzj.base.cmd.CommandContext; +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.cmd.gen.CrossLinkRegisterCts; +import com.huangzj.cmd.gen.CrossLinkRegisterStc; +import com.huangzj.cmd.gen.PbService; +import com.huangzj.cmd.gen.Service4_Method; +import com.huangzj.cross.config.CrossLinkAcceptProperties; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +/** + * 区服 TCP 连上跨服后的注册握手(仅 {@link CommandSource#CROSS_TCP})。 + */ +@Component +@RequiredArgsConstructor +@Cmd( + source = CommandSource.CROSS_TCP, + serviceId = PbService.Service_4_VALUE, + methodId = Service4_Method.Register_VALUE) +public class CrossLinkRegisterCommand extends AbstractTypedPbCommand { + + private final CrossLinkAcceptProperties acceptProperties; + + @Override + protected void run(CommandContext ctx, CrossLinkRegisterCts cts, CrossLinkRegisterStc.Builder stcBuilder) { + String expected = acceptProperties.getExpectedToken(); + // 跨服未配置 expected-token 时不校验,方便本地多区服联调;生产环境建议两边配置一致 + if (StringUtils.hasText(expected) && !expected.equals(cts.getToken())) { + stcBuilder.setOk(false).setMessage("token mismatch"); + return; + } + // server_id 用于日志、路由扩展;空则拒绝,避免匿名连接占坑 + if (!StringUtils.hasText(cts.getServerId())) { + stcBuilder.setOk(false).setMessage("server_id required"); + return; + } + stcBuilder.setOk(true).setMessage("ok " + cts.getServerId()); + } +} diff --git a/CrossModule/src/main/java/com/huangzj/cross/config/CrossLinkAcceptProperties.java b/CrossModule/src/main/java/com/huangzj/cross/config/CrossLinkAcceptProperties.java new file mode 100644 index 0000000..1ecce54 --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/config/CrossLinkAcceptProperties.java @@ -0,0 +1,17 @@ +package com.huangzj.cross.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 跨服侧:区服注册时可选的 token 校验(为空则不校验)。 + */ +@Getter +@Setter +@ConfigurationProperties(prefix = "cross.link") +public class CrossLinkAcceptProperties { + + /** 非空时须与区服 {@code cross.token} 一致才允许注册。 */ + private String expectedToken = ""; +} diff --git a/CrossModule/src/main/java/com/huangzj/cross/config/CrossTcpProperties.java b/CrossModule/src/main/java/com/huangzj/cross/config/CrossTcpProperties.java new file mode 100644 index 0000000..8b8424b --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/config/CrossTcpProperties.java @@ -0,0 +1,17 @@ +package com.huangzj.cross.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 跨服进程自己监听的 TCP 端口,长度前缀 + Protobuf 那一套。 + */ +@Getter +@Setter +@ConfigurationProperties(prefix = "cross.tcp") +public class CrossTcpProperties { + + /** Netty 监听端口,长度前缀 + protobuf 帧。 */ + private int port; +} diff --git a/CrossModule/src/main/java/com/huangzj/cross/net/CrossTcpChannelInitializer.java b/CrossModule/src/main/java/com/huangzj/cross/net/CrossTcpChannelInitializer.java new file mode 100644 index 0000000..0c55e6e --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/net/CrossTcpChannelInitializer.java @@ -0,0 +1,29 @@ +package com.huangzj.cross.net; + +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.base.cmd.ProtoRegistry; +import com.huangzj.base.frame.LengthPrefixedProtobuf; +import com.huangzj.base.net.CmdRpcTcpFrameHandler; +import com.huangzj.cross.cmd.CrossGameCommandRegistry; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.socket.SocketChannel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +/** 跨服 TCP:pipeline 上挂帧解码 + CmdRpc 业务 handler。 */ +@Component +@RequiredArgsConstructor +public class CrossTcpChannelInitializer extends ChannelInitializer { + + private final CrossGameCommandRegistry crossGameCommandRegistry; + private final ProtoRegistry protoRegistry; + + @Override + protected void initChannel(SocketChannel ch) { + ch.pipeline().addLast(LengthPrefixedProtobuf.newTcpFrameDecoder()); + ch.pipeline() + .addLast( + new CmdRpcTcpFrameHandler( + crossGameCommandRegistry, null, CommandSource.CROSS_TCP, protoRegistry)); + } +} diff --git a/CrossModule/src/main/java/com/huangzj/cross/net/CrossTcpServer.java b/CrossModule/src/main/java/com/huangzj/cross/net/CrossTcpServer.java new file mode 100644 index 0000000..d0b0fe3 --- /dev/null +++ b/CrossModule/src/main/java/com/huangzj/cross/net/CrossTcpServer.java @@ -0,0 +1,95 @@ +package com.huangzj.cross.net; + +import com.huangzj.cross.config.CrossTcpProperties; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import jakarta.annotation.PreDestroy; +import java.net.BindException; +import java.util.concurrent.TimeUnit; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +/** + * 跨服侧的 TCP 入口:Spring 起来之后绑端口,应用关掉时把线程组也收干净。 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class CrossTcpServer { + + private final CrossTcpProperties properties; + private final CrossTcpChannelInitializer crossTcpChannelInitializer; + private EventLoopGroup bossGroup; + private EventLoopGroup workerGroup; + private Channel serverChannel; + + /** 等 Spring 容器就绪再绑端口,避免 Bean 还没齐就开始接连接。 */ + @EventListener(ApplicationReadyEvent.class) + public void start() throws InterruptedException { + bossGroup = new NioEventLoopGroup(1); + workerGroup = new NioEventLoopGroup(); + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(crossTcpChannelInitializer); + serverChannel = b.bind(properties.getPort()).sync().channel(); + log.info("Cross TCP {}", properties.getPort()); + } catch (Exception e) { + if (findBindException(e) != null) { + shutdownGroupsOnly(); + int port = properties.getPort(); + throw new IllegalStateException( + "跨服 TCP 端口 " + + port + + " 已被占用(Address already in use)。请关闭占用该端口的进程,或在 application.yml 里修改 cross.tcp.port。" + + " Windows 可查:netstat -ano | findstr :" + port, + e); + } + shutdownGroupsOnly(); + throw e; + } + } + + private static BindException findBindException(Throwable t) { + while (t != null) { + if (t instanceof BindException) { + return (BindException) t; + } + t = t.getCause(); + } + return null; + } + + /** 绑定失败时尚未 assign serverChannel,只收掉线程组,避免泄漏。 */ + private void shutdownGroupsOnly() { + if (bossGroup != null) { + bossGroup.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + bossGroup = null; + } + if (workerGroup != null) { + workerGroup.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + workerGroup = null; + } + } + + /** 进程退出时把 channel 和线程组都关掉,别留一堆 Netty 线程 hanging。 */ + @PreDestroy + public void stop() throws InterruptedException { + if (serverChannel != null) { + serverChannel.close().syncUninterruptibly(); + } + if (bossGroup != null) { + bossGroup.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + } + if (workerGroup != null) { + workerGroup.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + } + } +} diff --git a/CrossModule/src/main/resources/application-dev.yml b/CrossModule/src/main/resources/application-dev.yml new file mode 100644 index 0000000..b8dd09d --- /dev/null +++ b/CrossModule/src/main/resources/application-dev.yml @@ -0,0 +1,10 @@ +# 开发环境 +cross: + tcp: + port: 9200 + link: + expected-token: "" + +app: + logging: + dir: logs/CrossModule diff --git a/CrossModule/src/main/resources/application-prod.yml b/CrossModule/src/main/resources/application-prod.yml new file mode 100644 index 0000000..7ea2288 --- /dev/null +++ b/CrossModule/src/main/resources/application-prod.yml @@ -0,0 +1,10 @@ +# 部署环境:监听端口、注册校验 token、日志目录建议走环境变量 +cross: + tcp: + port: ${CROSS_TCP_PORT:9200} + link: + expected-token: ${CROSS_LINK_EXPECTED_TOKEN:} + +app: + logging: + dir: ${APP_LOG_DIR:/var/log/comm-framework/cross} diff --git a/CrossModule/src/main/resources/application.yml b/CrossModule/src/main/resources/application.yml new file mode 100644 index 0000000..f0345b6 --- /dev/null +++ b/CrossModule/src/main/resources/application.yml @@ -0,0 +1,5 @@ +spring: + application: + name: cross-module + profiles: + active: ${SPRING_PROFILES_ACTIVE:dev} diff --git a/CrossModule/src/main/resources/logback-spring.xml b/CrossModule/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..799779d --- /dev/null +++ b/CrossModule/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${LOG_DIR}/info.log + + ${FILE_LOG_PATTERN} + UTF-8 + + + INFO + + + ERROR + DENY + NEUTRAL + + + ${LOG_DIR}/info.%d{yyyy-MM-dd}.%i.log.gz + 10MB + 14 + 512MB + + + + + + ${LOG_DIR}/error.log + + ${FILE_LOG_PATTERN} + UTF-8 + + + ERROR + ACCEPT + DENY + + + ${LOG_DIR}/error.%d{yyyy-MM-dd}.%i.log.gz + 10MB + 30 + 512MB + + + + + + + + + + diff --git a/CrossModule/target/classes/application-dev.yml b/CrossModule/target/classes/application-dev.yml new file mode 100644 index 0000000..b8dd09d --- /dev/null +++ b/CrossModule/target/classes/application-dev.yml @@ -0,0 +1,10 @@ +# 开发环境 +cross: + tcp: + port: 9200 + link: + expected-token: "" + +app: + logging: + dir: logs/CrossModule diff --git a/CrossModule/target/classes/application-prod.yml b/CrossModule/target/classes/application-prod.yml new file mode 100644 index 0000000..7ea2288 --- /dev/null +++ b/CrossModule/target/classes/application-prod.yml @@ -0,0 +1,10 @@ +# 部署环境:监听端口、注册校验 token、日志目录建议走环境变量 +cross: + tcp: + port: ${CROSS_TCP_PORT:9200} + link: + expected-token: ${CROSS_LINK_EXPECTED_TOKEN:} + +app: + logging: + dir: ${APP_LOG_DIR:/var/log/comm-framework/cross} diff --git a/CrossModule/target/classes/application.yml b/CrossModule/target/classes/application.yml new file mode 100644 index 0000000..f0345b6 --- /dev/null +++ b/CrossModule/target/classes/application.yml @@ -0,0 +1,5 @@ +spring: + application: + name: cross-module + profiles: + active: ${SPRING_PROFILES_ACTIVE:dev} diff --git a/CrossModule/target/classes/com/huangzj/cross/CrossModuleApplication.class b/CrossModule/target/classes/com/huangzj/cross/CrossModuleApplication.class new file mode 100644 index 0000000..74f4679 Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/CrossModuleApplication.class differ diff --git a/CrossModule/target/classes/com/huangzj/cross/cmd/CrossForwardCommand.class b/CrossModule/target/classes/com/huangzj/cross/cmd/CrossForwardCommand.class new file mode 100644 index 0000000..fe3fc6c Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/cmd/CrossForwardCommand.class differ diff --git a/CrossModule/target/classes/com/huangzj/cross/cmd/CrossGameCommandRegistry.class b/CrossModule/target/classes/com/huangzj/cross/cmd/CrossGameCommandRegistry.class new file mode 100644 index 0000000..6087d78 Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/cmd/CrossGameCommandRegistry.class differ diff --git a/CrossModule/target/classes/com/huangzj/cross/cmd/CrossLinkHeartbeatCommand.class b/CrossModule/target/classes/com/huangzj/cross/cmd/CrossLinkHeartbeatCommand.class new file mode 100644 index 0000000..2eb305c Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/cmd/CrossLinkHeartbeatCommand.class differ diff --git a/CrossModule/target/classes/com/huangzj/cross/cmd/CrossLinkRegisterCommand.class b/CrossModule/target/classes/com/huangzj/cross/cmd/CrossLinkRegisterCommand.class new file mode 100644 index 0000000..3f6d4a2 Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/cmd/CrossLinkRegisterCommand.class differ diff --git a/CrossModule/target/classes/com/huangzj/cross/config/CrossLinkAcceptProperties.class b/CrossModule/target/classes/com/huangzj/cross/config/CrossLinkAcceptProperties.class new file mode 100644 index 0000000..c720bfb Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/config/CrossLinkAcceptProperties.class differ diff --git a/CrossModule/target/classes/com/huangzj/cross/config/CrossTcpProperties.class b/CrossModule/target/classes/com/huangzj/cross/config/CrossTcpProperties.class new file mode 100644 index 0000000..3cf3392 Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/config/CrossTcpProperties.class differ diff --git a/CrossModule/target/classes/com/huangzj/cross/net/CrossTcpChannelInitializer.class b/CrossModule/target/classes/com/huangzj/cross/net/CrossTcpChannelInitializer.class new file mode 100644 index 0000000..53a91b0 Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/net/CrossTcpChannelInitializer.class differ diff --git a/CrossModule/target/classes/com/huangzj/cross/net/CrossTcpServer.class b/CrossModule/target/classes/com/huangzj/cross/net/CrossTcpServer.class new file mode 100644 index 0000000..e95e73b Binary files /dev/null and b/CrossModule/target/classes/com/huangzj/cross/net/CrossTcpServer.class differ diff --git a/CrossModule/target/classes/logback-spring.xml b/CrossModule/target/classes/logback-spring.xml new file mode 100644 index 0000000..799779d --- /dev/null +++ b/CrossModule/target/classes/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${LOG_DIR}/info.log + + ${FILE_LOG_PATTERN} + UTF-8 + + + INFO + + + ERROR + DENY + NEUTRAL + + + ${LOG_DIR}/info.%d{yyyy-MM-dd}.%i.log.gz + 10MB + 14 + 512MB + + + + + + ${LOG_DIR}/error.log + + ${FILE_LOG_PATTERN} + UTF-8 + + + ERROR + ACCEPT + DENY + + + ${LOG_DIR}/error.%d{yyyy-MM-dd}.%i.log.gz + 10MB + 30 + 512MB + + + + + + + + + + diff --git a/CrossModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/CrossModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..5b594a3 --- /dev/null +++ b/CrossModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,7 @@ +com\huangzj\cross\config\CrossTcpProperties.class +com\huangzj\cross\net\CrossTcpServer$1.class +com\huangzj\cross\cmd\CrossGameCommandRegistry.class +com\huangzj\cross\CrossModuleApplication.class +com\huangzj\cross\net\CrossTcpCommandHandler.class +com\huangzj\cross\net\CrossTcpServer.class +com\huangzj\cross\cmd\CrossForwardCommand.class diff --git a/CrossModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/CrossModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..e309ab0 --- /dev/null +++ b/CrossModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +F:\coding\comm-framework\CrossModule\src\main\java\com\huangzj\cross\cmd\CrossGameCommandRegistry.java +F:\coding\comm-framework\CrossModule\src\main\java\com\huangzj\cross\config\CrossTcpProperties.java +F:\coding\comm-framework\CrossModule\src\main\java\com\huangzj\cross\CrossModuleApplication.java +F:\coding\comm-framework\CrossModule\src\main\java\com\huangzj\cross\net\CrossTcpServer.java +F:\coding\comm-framework\CrossModule\src\main\java\com\huangzj\cross\cmd\CrossForwardCommand.java +F:\coding\comm-framework\CrossModule\src\main\java\com\huangzj\cross\net\CrossTcpCommandHandler.java diff --git a/ProtoBufModule/README.md b/ProtoBufModule/README.md new file mode 100644 index 0000000..fd6725c --- /dev/null +++ b/ProtoBufModule/README.md @@ -0,0 +1,84 @@ +# ProtoBufModule + +本模块承载 **RPC 与业务消息的二进制契约**:所有 TCP 链路上传输的业务体都通过此处定义的 `protobuf` 生成 Java 类(包名 `com.huangzj.cmd.gen`)。 + +## 职责 + +- 维护 `src/main/protobuf` 下的 `.proto` 源文件。 +- Maven `protobuf-maven-plugin` 在 `generate-sources` 阶段生成 Java 源码到 `target/generated-sources/protobuf/java`。 +- **其它模块**(BaseModule、ServerModule、CrossModule)仅依赖本模块打出的 jar,不重复拷贝 `.proto`。 + +## 目录结构(源文件) + +```text +src/main/protobuf/ +└── serverProto/ + ├── cmd_rpc.proto # CmdRpcEnvelope、各 CTS/STC、Method 枚举 + └── pb_service.proto # PbService(Service_1 ~ Service_4) +``` + +> 历史上独立的 `CrossProto` 已移除;跨服与区服共用 **`demo.cmd`** 包下的消息,通过 **service/method + CommandSource** 在 Java 侧区分语义。 + +## 网络层核心消息:`CmdRpcEnvelope` + +```protobuf +message CmdRpcEnvelope { + uint32 service_id = 1; + uint32 method_id = 2; + bytes payload = 3; // 具体 CTS 的序列化字节 + int32 cross_ret = 4; // 预留/透传 + uint32 link_seq = 5; // 区服↔跨服长连接多路复用序号(客户端 TCP 可为 0) +} +``` + +### `link_seq` 的作用(与网络实现配合) + +```mermaid +sequenceDiagram + participant Z as 区服 CrossTcpClient + participant X as 跨服 TCP + Note over Z,X: 单条 TCP 上可能同时存在多帧在途 + Z->>X: 请求 A (link_seq=101) + Z->>X: 请求 B (link_seq=102) + X-->>Z: 响应 B (link_seq=102) + X-->>Z: 响应 A (link_seq=101) +``` + +- 区服在 **`CrossTcpClient`** 内为每次 `roundTrip` / 注册 / 心跳分配 **非 0** 的 `link_seq`。 +- 跨服命令通过 **`AbstractTypedPbCommand`** 回包时 **原样带回** 请求信封中的 `link_seq`,以便客户端把响应与 `CompletableFuture` 对应。 + +## 服务与方法枚举 + +| PbService | 用途 | +|-----------|------| +| Service_1 | 路径 1 示例(Echo) | +| Service_2 | 跨服业务 Method2(`CrossForward*`) | +| Service_3 | 路径 3 区服对客户端暴露的中转接口 | +| Service_4 | **链路控制**:Register、Heartbeat(仅区服→跨服长连接上使用) | + +`Service4_Method`:`Register`、`Heartbeat`,载荷分别为 `CrossLinkRegisterCts/Stc`、`CrossLinkHeartbeatCts/Stc`。 + +## 业务消息(与路径对应) + +- **路径 1**:`CmdEchoCts` / `CmdEchoStc`。 +- **路径 2(客户端侧)**:`CrossProxyCts` / `CrossProxyStc`(区服内会转为 `CrossForward*` 再发往跨服)。 +- **路径 3**:客户端 payload 使用 **`CrossForwardCts`** 形态(与跨服 Service_2/Method2 一致),信封为 Service_3/Method3。 +- **跨服 Service_2/Method2**:`CrossForwardCts` / `CrossForwardStc`。 + +## 生成代码 + +```bash +cd ProtoBufModule +mvn -q generate-sources +# 或使用 genpb.bat(Windows,会探测 Maven) +``` + +生成物加入 `ProtoBufModule` jar,依赖方编译时自动可见。 + +## 扩展约定 + +新增 RPC 时建议: + +1. 在 `pb_service.proto` 增加 `PbService` 枚举值(若新服务号)。 +2. 在 `cmd_rpc.proto` 增加 `ServiceX_Method` 与 CTS/STC `message`。 +3. 执行 `generate-sources` 后,在 **BaseModule** 侧通过 `@Cmd` + `AbstractTypedPbCommand` 或 `GameCommand` 实现逻辑,并由 **`ProtoRegistryAutoConfigurer`** 自动注册 `ProtoInfo`(强类型命令)。 diff --git a/ProtoBufModule/genpb.bat b/ProtoBufModule/genpb.bat new file mode 100644 index 0000000..59c1dd5 --- /dev/null +++ b/ProtoBufModule/genpb.bat @@ -0,0 +1,21 @@ +@echo off +setlocal +cd /d "%~dp0" +set "POM=%~dp0pom.xml" +set "MVN_CMD=" +if defined MAVEN_HOME if exist "%MAVEN_HOME%\bin\mvn.cmd" set "MVN_CMD=%MAVEN_HOME%\bin\mvn.cmd" +if not defined MVN_CMD where mvn >nul 2>&1 && set "MVN_CMD=mvn" +if not defined MVN_CMD for %%I in ( + "C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.7\plugins\maven\lib\maven3\bin\mvn.cmd" + "C:\Program Files\JetBrains\IntelliJ IDEA 2023.3.8\plugins\maven\lib\maven3\bin\mvn.cmd" +) do if exist %%~I set "MVN_CMD=%%~I" +if not defined MVN_CMD ( + echo Set MAVEN_HOME or add mvn to PATH. + exit /b 1 +) +call "%MVN_CMD%" -q -f "%POM%" generate-sources +set "ERR=%ERRORLEVEL%" +if not "%ERR%"=="0" exit /b %ERR% +echo Java sources: %~dp0target\generated-sources\protobuf\java +endlocal +exit /b 0 diff --git a/ProtoBufModule/pom.xml b/ProtoBufModule/pom.xml new file mode 100644 index 0000000..c6f1e06 --- /dev/null +++ b/ProtoBufModule/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + + huangzj + comm-framework + 0.0.1-SNAPSHOT + ../pom.xml + + + ProtoBufModule + jar + ProtoBufModule + + + + com.google.protobuf + protobuf-java + ${protobuf.version} + + + + + + + kr.motd.maven + os-maven-plugin + 1.7.1 + + + + + org.xolstice.maven.plugins + protobuf-maven-plugin + 0.6.1 + + ${project.basedir}/src/main/protobuf + com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier} + + + + + compile + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.5.0 + + + add-sources + generate-sources + + add-source + + + + ${project.build.directory}/generated-sources/protobuf/java + + + + + + + + diff --git a/ProtoBufModule/src/main/protobuf/serverProto/cmd_rpc.proto b/ProtoBufModule/src/main/protobuf/serverProto/cmd_rpc.proto new file mode 100644 index 0000000..132a165 --- /dev/null +++ b/ProtoBufModule/src/main/protobuf/serverProto/cmd_rpc.proto @@ -0,0 +1,93 @@ +syntax = "proto3"; + +package demo.cmd; + +option java_package = "com.huangzj.cmd.gen"; +option java_multiple_files = true; + + +enum Service1_Method{ + Default1 = 0; + Method1 = 1; +} + + +enum Service2_Method{ + Default2 = 0; + Method2 = 1; +} + + +enum Service3_Method{ + Default3 = 0; + Method3 = 1; +} + +/** 区服 ↔ 跨服链路控制(注册、心跳),不经客户端 TCP。 */ +enum Service4_Method { + Default4 = 0; + Register = 1; + Heartbeat = 2; +} + +service Service1Service { + rpc GetUser (CmdEchoCts) returns (CmdEchoStc); +} + + +message CmdRpcEnvelope { + uint32 service_id = 1; + uint32 method_id = 2; + bytes payload = 3; + int32 cross_ret = 4; + /** 区服↔跨服链路上对齐请求与响应;客户端 TCP 可保持默认 0。 */ + uint32 link_seq = 5; +} + +message CmdEchoCts { + string text = 1; +} + +message CmdEchoStc { + string text = 1; + int64 server_time_ms = 2; +} + +message CrossForwardCts { + string trace = 1; +} + +message CrossForwardStc { + string trace = 1; + int64 cross_time_ms = 2; +} + +message CrossProxyCts { + string trace = 1; +} + +message CrossProxyStc { + string trace = 1; + int64 cross_time_ms = 2; + /** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 */ + string server_note = 3; +} + +message CrossLinkRegisterCts { + string server_id = 1; + string token = 2; +} + +message CrossLinkRegisterStc { + bool ok = 1; + string message = 2; +} + +message CrossLinkHeartbeatCts { + int64 client_time_ms = 1; +} + +message CrossLinkHeartbeatStc { + int64 client_time_ms = 1; + int64 cross_time_ms = 2; +} diff --git a/ProtoBufModule/src/main/protobuf/serverProto/pb_service.proto b/ProtoBufModule/src/main/protobuf/serverProto/pb_service.proto new file mode 100644 index 0000000..6a93970 --- /dev/null +++ b/ProtoBufModule/src/main/protobuf/serverProto/pb_service.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package demo.cmd; + +option java_package = "com.huangzj.cmd.gen"; +option java_multiple_files = true; + +enum PbService { + Default = 0; + Service_1 = 1; + Service_2 = 2; + Service_3 = 3; + Service_4 = 4; +} \ No newline at end of file diff --git a/ProtoBufModule/target/classes/CrossProto/cross_link.proto b/ProtoBufModule/target/classes/CrossProto/cross_link.proto new file mode 100644 index 0000000..9a43887 --- /dev/null +++ b/ProtoBufModule/target/classes/CrossProto/cross_link.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +package demo.crosslink; + +option java_package = "com.huangzj.cross.gen"; +option java_multiple_files = true; + +message CrossPing { + string trace = 1; + int32 nonce = 2; +} + +message CrossPong { + string trace = 1; + int32 nonce = 2; + int64 cross_time_ms = 3; +} diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts$1.class new file mode 100644 index 0000000..e77b8ee Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts$Builder.class new file mode 100644 index 0000000..450f286 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts.class new file mode 100644 index 0000000..b2295bc Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCts.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCtsOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCtsOrBuilder.class new file mode 100644 index 0000000..3920322 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoCtsOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc$1.class new file mode 100644 index 0000000..b79fafa Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc$Builder.class new file mode 100644 index 0000000..6f0c0d7 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc.class new file mode 100644 index 0000000..1c63c60 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStc.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStcOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStcOrBuilder.class new file mode 100644 index 0000000..c50353d Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdEchoStcOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpc.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpc.class new file mode 100644 index 0000000..efb9692 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpc.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope$1.class new file mode 100644 index 0000000..0487dd4 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope$Builder.class new file mode 100644 index 0000000..5bd4df8 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope.class new file mode 100644 index 0000000..3f3fd00 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelope.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelopeOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelopeOrBuilder.class new file mode 100644 index 0000000..9060b58 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CmdRpcEnvelopeOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts$1.class new file mode 100644 index 0000000..4661ff6 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts$Builder.class new file mode 100644 index 0000000..7c1e059 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts.class new file mode 100644 index 0000000..6078318 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCts.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCtsOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCtsOrBuilder.class new file mode 100644 index 0000000..3a6a1ed Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardCtsOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc$1.class new file mode 100644 index 0000000..defbb21 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc$Builder.class new file mode 100644 index 0000000..348cc52 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc.class new file mode 100644 index 0000000..2ab3fea Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStc.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStcOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStcOrBuilder.class new file mode 100644 index 0000000..2ba447a Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossForwardStcOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts$1.class new file mode 100644 index 0000000..bf5a531 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts$Builder.class new file mode 100644 index 0000000..544976a Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts.class new file mode 100644 index 0000000..b5cd725 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCts.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCtsOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCtsOrBuilder.class new file mode 100644 index 0000000..b3a5597 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatCtsOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc$1.class new file mode 100644 index 0000000..bf8d016 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc$Builder.class new file mode 100644 index 0000000..4e357a2 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc.class new file mode 100644 index 0000000..23bda36 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStc.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStcOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStcOrBuilder.class new file mode 100644 index 0000000..5f4f3b9 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkHeartbeatStcOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts$1.class new file mode 100644 index 0000000..c66825f Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts$Builder.class new file mode 100644 index 0000000..2e1e576 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts.class new file mode 100644 index 0000000..72c857f Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCts.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCtsOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCtsOrBuilder.class new file mode 100644 index 0000000..858a622 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterCtsOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc$1.class new file mode 100644 index 0000000..169984e Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc$Builder.class new file mode 100644 index 0000000..d0a7d89 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc.class new file mode 100644 index 0000000..65660af Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStc.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStcOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStcOrBuilder.class new file mode 100644 index 0000000..073a8cf Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossLinkRegisterStcOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts$1.class new file mode 100644 index 0000000..220cb7a Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts$Builder.class new file mode 100644 index 0000000..7f77356 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts.class new file mode 100644 index 0000000..b46af6c Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCts.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCtsOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCtsOrBuilder.class new file mode 100644 index 0000000..c95ca08 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyCtsOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc$1.class new file mode 100644 index 0000000..2aead63 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc$Builder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc$Builder.class new file mode 100644 index 0000000..baa88de Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc$Builder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc.class new file mode 100644 index 0000000..a3d5426 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStc.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStcOrBuilder.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStcOrBuilder.class new file mode 100644 index 0000000..0dcad8d Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/CrossProxyStcOrBuilder.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbService$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbService$1.class new file mode 100644 index 0000000..4dce9af Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbService$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbService.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbService.class new file mode 100644 index 0000000..dd58f12 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbService.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbServiceOuterClass.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbServiceOuterClass.class new file mode 100644 index 0000000..bb321f3 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/PbServiceOuterClass.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service1_Method$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service1_Method$1.class new file mode 100644 index 0000000..144f196 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service1_Method$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service1_Method.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service1_Method.class new file mode 100644 index 0000000..67e394a Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service1_Method.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service2_Method$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service2_Method$1.class new file mode 100644 index 0000000..8ce2307 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service2_Method$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service2_Method.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service2_Method.class new file mode 100644 index 0000000..a8a11b0 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service2_Method.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service3_Method$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service3_Method$1.class new file mode 100644 index 0000000..5c7e45e Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service3_Method$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service3_Method.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service3_Method.class new file mode 100644 index 0000000..d8f422a Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service3_Method.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service4_Method$1.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service4_Method$1.class new file mode 100644 index 0000000..5def4cf Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service4_Method$1.class differ diff --git a/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service4_Method.class b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service4_Method.class new file mode 100644 index 0000000..e594ca9 Binary files /dev/null and b/ProtoBufModule/target/classes/com/huangzj/cmd/gen/Service4_Method.class differ diff --git a/ProtoBufModule/target/classes/serverProto/cmd_rpc.proto b/ProtoBufModule/target/classes/serverProto/cmd_rpc.proto new file mode 100644 index 0000000..132a165 --- /dev/null +++ b/ProtoBufModule/target/classes/serverProto/cmd_rpc.proto @@ -0,0 +1,93 @@ +syntax = "proto3"; + +package demo.cmd; + +option java_package = "com.huangzj.cmd.gen"; +option java_multiple_files = true; + + +enum Service1_Method{ + Default1 = 0; + Method1 = 1; +} + + +enum Service2_Method{ + Default2 = 0; + Method2 = 1; +} + + +enum Service3_Method{ + Default3 = 0; + Method3 = 1; +} + +/** 区服 ↔ 跨服链路控制(注册、心跳),不经客户端 TCP。 */ +enum Service4_Method { + Default4 = 0; + Register = 1; + Heartbeat = 2; +} + +service Service1Service { + rpc GetUser (CmdEchoCts) returns (CmdEchoStc); +} + + +message CmdRpcEnvelope { + uint32 service_id = 1; + uint32 method_id = 2; + bytes payload = 3; + int32 cross_ret = 4; + /** 区服↔跨服链路上对齐请求与响应;客户端 TCP 可保持默认 0。 */ + uint32 link_seq = 5; +} + +message CmdEchoCts { + string text = 1; +} + +message CmdEchoStc { + string text = 1; + int64 server_time_ms = 2; +} + +message CrossForwardCts { + string trace = 1; +} + +message CrossForwardStc { + string trace = 1; + int64 cross_time_ms = 2; +} + +message CrossProxyCts { + string trace = 1; +} + +message CrossProxyStc { + string trace = 1; + int64 cross_time_ms = 2; + /** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 */ + string server_note = 3; +} + +message CrossLinkRegisterCts { + string server_id = 1; + string token = 2; +} + +message CrossLinkRegisterStc { + bool ok = 1; + string message = 2; +} + +message CrossLinkHeartbeatCts { + int64 client_time_ms = 1; +} + +message CrossLinkHeartbeatStc { + int64 client_time_ms = 1; + int64 cross_time_ms = 2; +} diff --git a/ProtoBufModule/target/classes/serverProto/echo.proto b/ProtoBufModule/target/classes/serverProto/echo.proto new file mode 100644 index 0000000..0f431da --- /dev/null +++ b/ProtoBufModule/target/classes/serverProto/echo.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package demo.comm; + +option java_package = "com.huangzj.comm.gen"; +option java_outer_classname = "EchoProto"; +option java_multiple_files = true; + +message EchoRequest { + string text = 1; +} + +message EchoResponse { + string text = 1; + int64 server_time_ms = 2; +} diff --git a/ProtoBufModule/target/classes/serverProto/pb_service.proto b/ProtoBufModule/target/classes/serverProto/pb_service.proto new file mode 100644 index 0000000..6a93970 --- /dev/null +++ b/ProtoBufModule/target/classes/serverProto/pb_service.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package demo.cmd; + +option java_package = "com.huangzj.cmd.gen"; +option java_multiple_files = true; + +enum PbService { + Default = 0; + Service_1 = 1; + Service_2 = 2; + Service_3 = 3; + Service_4 = 4; +} \ No newline at end of file diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoCts.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoCts.java new file mode 100644 index 0000000..bfcdaa8 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoCts.java @@ -0,0 +1,542 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CmdEchoCts} + */ +public final class CmdEchoCts extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CmdEchoCts) + CmdEchoCtsOrBuilder { +private static final long serialVersionUID = 0L; + // Use CmdEchoCts.newBuilder() to construct. + private CmdEchoCts(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CmdEchoCts() { + text_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CmdEchoCts(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CmdEchoCts.class, com.huangzj.cmd.gen.CmdEchoCts.Builder.class); + } + + public static final int TEXT_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object text_ = ""; + /** + * string text = 1; + * @return The text. + */ + @java.lang.Override + public java.lang.String getText() { + java.lang.Object ref = text_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + text_ = s; + return s; + } + } + /** + * string text = 1; + * @return The bytes for text. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTextBytes() { + java.lang.Object ref = text_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + text_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, text_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, text_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CmdEchoCts)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CmdEchoCts other = (com.huangzj.cmd.gen.CmdEchoCts) obj; + + if (!getText() + .equals(other.getText())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TEXT_FIELD_NUMBER; + hash = (53 * hash) + getText().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CmdEchoCts parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CmdEchoCts parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CmdEchoCts parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CmdEchoCts prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CmdEchoCts} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CmdEchoCts) + com.huangzj.cmd.gen.CmdEchoCtsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CmdEchoCts.class, com.huangzj.cmd.gen.CmdEchoCts.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CmdEchoCts.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + text_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoCts_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdEchoCts getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CmdEchoCts.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdEchoCts build() { + com.huangzj.cmd.gen.CmdEchoCts result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdEchoCts buildPartial() { + com.huangzj.cmd.gen.CmdEchoCts result = new com.huangzj.cmd.gen.CmdEchoCts(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CmdEchoCts result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.text_ = text_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CmdEchoCts) { + return mergeFrom((com.huangzj.cmd.gen.CmdEchoCts)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CmdEchoCts other) { + if (other == com.huangzj.cmd.gen.CmdEchoCts.getDefaultInstance()) return this; + if (!other.getText().isEmpty()) { + text_ = other.text_; + bitField0_ |= 0x00000001; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + text_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object text_ = ""; + /** + * string text = 1; + * @return The text. + */ + public java.lang.String getText() { + java.lang.Object ref = text_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + text_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string text = 1; + * @return The bytes for text. + */ + public com.google.protobuf.ByteString + getTextBytes() { + java.lang.Object ref = text_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + text_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string text = 1; + * @param value The text to set. + * @return This builder for chaining. + */ + public Builder setText( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + text_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * string text = 1; + * @return This builder for chaining. + */ + public Builder clearText() { + text_ = getDefaultInstance().getText(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * string text = 1; + * @param value The bytes for text to set. + * @return This builder for chaining. + */ + public Builder setTextBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + text_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CmdEchoCts) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CmdEchoCts) + private static final com.huangzj.cmd.gen.CmdEchoCts DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CmdEchoCts(); + } + + public static com.huangzj.cmd.gen.CmdEchoCts getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CmdEchoCts parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdEchoCts getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoCtsOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoCtsOrBuilder.java new file mode 100644 index 0000000..4e25ed6 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoCtsOrBuilder.java @@ -0,0 +1,22 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CmdEchoCtsOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CmdEchoCts) + com.google.protobuf.MessageOrBuilder { + + /** + * string text = 1; + * @return The text. + */ + java.lang.String getText(); + /** + * string text = 1; + * @return The bytes for text. + */ + com.google.protobuf.ByteString + getTextBytes(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoStc.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoStc.java new file mode 100644 index 0000000..f1e01a9 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoStc.java @@ -0,0 +1,609 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CmdEchoStc} + */ +public final class CmdEchoStc extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CmdEchoStc) + CmdEchoStcOrBuilder { +private static final long serialVersionUID = 0L; + // Use CmdEchoStc.newBuilder() to construct. + private CmdEchoStc(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CmdEchoStc() { + text_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CmdEchoStc(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CmdEchoStc.class, com.huangzj.cmd.gen.CmdEchoStc.Builder.class); + } + + public static final int TEXT_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object text_ = ""; + /** + * string text = 1; + * @return The text. + */ + @java.lang.Override + public java.lang.String getText() { + java.lang.Object ref = text_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + text_ = s; + return s; + } + } + /** + * string text = 1; + * @return The bytes for text. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTextBytes() { + java.lang.Object ref = text_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + text_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SERVER_TIME_MS_FIELD_NUMBER = 2; + private long serverTimeMs_ = 0L; + /** + * int64 server_time_ms = 2; + * @return The serverTimeMs. + */ + @java.lang.Override + public long getServerTimeMs() { + return serverTimeMs_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, text_); + } + if (serverTimeMs_ != 0L) { + output.writeInt64(2, serverTimeMs_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(text_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, text_); + } + if (serverTimeMs_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(2, serverTimeMs_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CmdEchoStc)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CmdEchoStc other = (com.huangzj.cmd.gen.CmdEchoStc) obj; + + if (!getText() + .equals(other.getText())) return false; + if (getServerTimeMs() + != other.getServerTimeMs()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TEXT_FIELD_NUMBER; + hash = (53 * hash) + getText().hashCode(); + hash = (37 * hash) + SERVER_TIME_MS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getServerTimeMs()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CmdEchoStc parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CmdEchoStc parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CmdEchoStc parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CmdEchoStc prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CmdEchoStc} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CmdEchoStc) + com.huangzj.cmd.gen.CmdEchoStcOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CmdEchoStc.class, com.huangzj.cmd.gen.CmdEchoStc.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CmdEchoStc.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + text_ = ""; + serverTimeMs_ = 0L; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdEchoStc_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdEchoStc getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CmdEchoStc.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdEchoStc build() { + com.huangzj.cmd.gen.CmdEchoStc result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdEchoStc buildPartial() { + com.huangzj.cmd.gen.CmdEchoStc result = new com.huangzj.cmd.gen.CmdEchoStc(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CmdEchoStc result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.text_ = text_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.serverTimeMs_ = serverTimeMs_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CmdEchoStc) { + return mergeFrom((com.huangzj.cmd.gen.CmdEchoStc)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CmdEchoStc other) { + if (other == com.huangzj.cmd.gen.CmdEchoStc.getDefaultInstance()) return this; + if (!other.getText().isEmpty()) { + text_ = other.text_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.getServerTimeMs() != 0L) { + setServerTimeMs(other.getServerTimeMs()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + text_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 16: { + serverTimeMs_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 16 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object text_ = ""; + /** + * string text = 1; + * @return The text. + */ + public java.lang.String getText() { + java.lang.Object ref = text_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + text_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string text = 1; + * @return The bytes for text. + */ + public com.google.protobuf.ByteString + getTextBytes() { + java.lang.Object ref = text_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + text_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string text = 1; + * @param value The text to set. + * @return This builder for chaining. + */ + public Builder setText( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + text_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * string text = 1; + * @return This builder for chaining. + */ + public Builder clearText() { + text_ = getDefaultInstance().getText(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * string text = 1; + * @param value The bytes for text to set. + * @return This builder for chaining. + */ + public Builder setTextBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + text_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long serverTimeMs_ ; + /** + * int64 server_time_ms = 2; + * @return The serverTimeMs. + */ + @java.lang.Override + public long getServerTimeMs() { + return serverTimeMs_; + } + /** + * int64 server_time_ms = 2; + * @param value The serverTimeMs to set. + * @return This builder for chaining. + */ + public Builder setServerTimeMs(long value) { + + serverTimeMs_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * int64 server_time_ms = 2; + * @return This builder for chaining. + */ + public Builder clearServerTimeMs() { + bitField0_ = (bitField0_ & ~0x00000002); + serverTimeMs_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CmdEchoStc) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CmdEchoStc) + private static final com.huangzj.cmd.gen.CmdEchoStc DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CmdEchoStc(); + } + + public static com.huangzj.cmd.gen.CmdEchoStc getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CmdEchoStc parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdEchoStc getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoStcOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoStcOrBuilder.java new file mode 100644 index 0000000..ebfc70b --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdEchoStcOrBuilder.java @@ -0,0 +1,28 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CmdEchoStcOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CmdEchoStc) + com.google.protobuf.MessageOrBuilder { + + /** + * string text = 1; + * @return The text. + */ + java.lang.String getText(); + /** + * string text = 1; + * @return The bytes for text. + */ + com.google.protobuf.ByteString + getTextBytes(); + + /** + * int64 server_time_ms = 2; + * @return The serverTimeMs. + */ + long getServerTimeMs(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpc.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpc.java new file mode 100644 index 0000000..7d21f55 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpc.java @@ -0,0 +1,181 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public final class CmdRpc { + private CmdRpc() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CmdRpcEnvelope_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CmdRpcEnvelope_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CmdEchoCts_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CmdEchoCts_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CmdEchoStc_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CmdEchoStc_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CrossForwardCts_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CrossForwardCts_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CrossForwardStc_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CrossForwardStc_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CrossProxyCts_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CrossProxyCts_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CrossProxyStc_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CrossProxyStc_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CrossLinkRegisterCts_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CrossLinkRegisterCts_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CrossLinkRegisterStc_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CrossLinkRegisterStc_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CrossLinkHeartbeatCts_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CrossLinkHeartbeatCts_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_demo_cmd_CrossLinkHeartbeatStc_descriptor; + static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_demo_cmd_CrossLinkHeartbeatStc_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\031serverProto/cmd_rpc.proto\022\010demo.cmd\"m\n" + + "\016CmdRpcEnvelope\022\022\n\nservice_id\030\001 \001(\r\022\021\n\tm" + + "ethod_id\030\002 \001(\r\022\017\n\007payload\030\003 \001(\014\022\021\n\tcross" + + "_ret\030\004 \001(\005\022\020\n\010link_seq\030\005 \001(\r\"\032\n\nCmdEchoC" + + "ts\022\014\n\004text\030\001 \001(\t\"2\n\nCmdEchoStc\022\014\n\004text\030\001" + + " \001(\t\022\026\n\016server_time_ms\030\002 \001(\003\" \n\017CrossFor" + + "wardCts\022\r\n\005trace\030\001 \001(\t\"7\n\017CrossForwardSt" + + "c\022\r\n\005trace\030\001 \001(\t\022\025\n\rcross_time_ms\030\002 \001(\003\"" + + "\036\n\rCrossProxyCts\022\r\n\005trace\030\001 \001(\t\"J\n\rCross" + + "ProxyStc\022\r\n\005trace\030\001 \001(\t\022\025\n\rcross_time_ms" + + "\030\002 \001(\003\022\023\n\013server_note\030\003 \001(\t\"8\n\024CrossLink" + + "RegisterCts\022\021\n\tserver_id\030\001 \001(\t\022\r\n\005token\030" + + "\002 \001(\t\"3\n\024CrossLinkRegisterStc\022\n\n\002ok\030\001 \001(" + + "\010\022\017\n\007message\030\002 \001(\t\"/\n\025CrossLinkHeartbeat" + + "Cts\022\026\n\016client_time_ms\030\001 \001(\003\"F\n\025CrossLink" + + "HeartbeatStc\022\026\n\016client_time_ms\030\001 \001(\003\022\025\n\r" + + "cross_time_ms\030\002 \001(\003*,\n\017Service1_Method\022\014" + + "\n\010Default1\020\000\022\013\n\007Method1\020\001*,\n\017Service2_Me" + + "thod\022\014\n\010Default2\020\000\022\013\n\007Method2\020\001*,\n\017Servi" + + "ce3_Method\022\014\n\010Default3\020\000\022\013\n\007Method3\020\001*<\n" + + "\017Service4_Method\022\014\n\010Default4\020\000\022\014\n\010Regist" + + "er\020\001\022\r\n\tHeartbeat\020\0022H\n\017Service1Service\0225" + + "\n\007GetUser\022\024.demo.cmd.CmdEchoCts\032\024.demo.c" + + "md.CmdEchoStcB\027\n\023com.huangzj.cmd.genP\001b\006" + + "proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + internal_static_demo_cmd_CmdRpcEnvelope_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_demo_cmd_CmdRpcEnvelope_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CmdRpcEnvelope_descriptor, + new java.lang.String[] { "ServiceId", "MethodId", "Payload", "CrossRet", "LinkSeq", }); + internal_static_demo_cmd_CmdEchoCts_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_demo_cmd_CmdEchoCts_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CmdEchoCts_descriptor, + new java.lang.String[] { "Text", }); + internal_static_demo_cmd_CmdEchoStc_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_demo_cmd_CmdEchoStc_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CmdEchoStc_descriptor, + new java.lang.String[] { "Text", "ServerTimeMs", }); + internal_static_demo_cmd_CrossForwardCts_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_demo_cmd_CrossForwardCts_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CrossForwardCts_descriptor, + new java.lang.String[] { "Trace", }); + internal_static_demo_cmd_CrossForwardStc_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_demo_cmd_CrossForwardStc_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CrossForwardStc_descriptor, + new java.lang.String[] { "Trace", "CrossTimeMs", }); + internal_static_demo_cmd_CrossProxyCts_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_demo_cmd_CrossProxyCts_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CrossProxyCts_descriptor, + new java.lang.String[] { "Trace", }); + internal_static_demo_cmd_CrossProxyStc_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_demo_cmd_CrossProxyStc_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CrossProxyStc_descriptor, + new java.lang.String[] { "Trace", "CrossTimeMs", "ServerNote", }); + internal_static_demo_cmd_CrossLinkRegisterCts_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_demo_cmd_CrossLinkRegisterCts_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CrossLinkRegisterCts_descriptor, + new java.lang.String[] { "ServerId", "Token", }); + internal_static_demo_cmd_CrossLinkRegisterStc_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_demo_cmd_CrossLinkRegisterStc_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CrossLinkRegisterStc_descriptor, + new java.lang.String[] { "Ok", "Message", }); + internal_static_demo_cmd_CrossLinkHeartbeatCts_descriptor = + getDescriptor().getMessageTypes().get(9); + internal_static_demo_cmd_CrossLinkHeartbeatCts_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CrossLinkHeartbeatCts_descriptor, + new java.lang.String[] { "ClientTimeMs", }); + internal_static_demo_cmd_CrossLinkHeartbeatStc_descriptor = + getDescriptor().getMessageTypes().get(10); + internal_static_demo_cmd_CrossLinkHeartbeatStc_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_demo_cmd_CrossLinkHeartbeatStc_descriptor, + new java.lang.String[] { "ClientTimeMs", "CrossTimeMs", }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpcEnvelope.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpcEnvelope.java new file mode 100644 index 0000000..f53f7df --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpcEnvelope.java @@ -0,0 +1,753 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CmdRpcEnvelope} + */ +public final class CmdRpcEnvelope extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CmdRpcEnvelope) + CmdRpcEnvelopeOrBuilder { +private static final long serialVersionUID = 0L; + // Use CmdRpcEnvelope.newBuilder() to construct. + private CmdRpcEnvelope(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CmdRpcEnvelope() { + payload_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CmdRpcEnvelope(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdRpcEnvelope_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdRpcEnvelope_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CmdRpcEnvelope.class, com.huangzj.cmd.gen.CmdRpcEnvelope.Builder.class); + } + + public static final int SERVICE_ID_FIELD_NUMBER = 1; + private int serviceId_ = 0; + /** + * uint32 service_id = 1; + * @return The serviceId. + */ + @java.lang.Override + public int getServiceId() { + return serviceId_; + } + + public static final int METHOD_ID_FIELD_NUMBER = 2; + private int methodId_ = 0; + /** + * uint32 method_id = 2; + * @return The methodId. + */ + @java.lang.Override + public int getMethodId() { + return methodId_; + } + + public static final int PAYLOAD_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString payload_ = com.google.protobuf.ByteString.EMPTY; + /** + * bytes payload = 3; + * @return The payload. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPayload() { + return payload_; + } + + public static final int CROSS_RET_FIELD_NUMBER = 4; + private int crossRet_ = 0; + /** + * int32 cross_ret = 4; + * @return The crossRet. + */ + @java.lang.Override + public int getCrossRet() { + return crossRet_; + } + + public static final int LINK_SEQ_FIELD_NUMBER = 5; + private int linkSeq_ = 0; + /** + *

+   ** 区服↔跨服链路上对齐请求与响应;客户端 TCP 可保持默认 0。 
+   * 
+ * + * uint32 link_seq = 5; + * @return The linkSeq. + */ + @java.lang.Override + public int getLinkSeq() { + return linkSeq_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (serviceId_ != 0) { + output.writeUInt32(1, serviceId_); + } + if (methodId_ != 0) { + output.writeUInt32(2, methodId_); + } + if (!payload_.isEmpty()) { + output.writeBytes(3, payload_); + } + if (crossRet_ != 0) { + output.writeInt32(4, crossRet_); + } + if (linkSeq_ != 0) { + output.writeUInt32(5, linkSeq_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (serviceId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(1, serviceId_); + } + if (methodId_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(2, methodId_); + } + if (!payload_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(3, payload_); + } + if (crossRet_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(4, crossRet_); + } + if (linkSeq_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeUInt32Size(5, linkSeq_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CmdRpcEnvelope)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CmdRpcEnvelope other = (com.huangzj.cmd.gen.CmdRpcEnvelope) obj; + + if (getServiceId() + != other.getServiceId()) return false; + if (getMethodId() + != other.getMethodId()) return false; + if (!getPayload() + .equals(other.getPayload())) return false; + if (getCrossRet() + != other.getCrossRet()) return false; + if (getLinkSeq() + != other.getLinkSeq()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SERVICE_ID_FIELD_NUMBER; + hash = (53 * hash) + getServiceId(); + hash = (37 * hash) + METHOD_ID_FIELD_NUMBER; + hash = (53 * hash) + getMethodId(); + hash = (37 * hash) + PAYLOAD_FIELD_NUMBER; + hash = (53 * hash) + getPayload().hashCode(); + hash = (37 * hash) + CROSS_RET_FIELD_NUMBER; + hash = (53 * hash) + getCrossRet(); + hash = (37 * hash) + LINK_SEQ_FIELD_NUMBER; + hash = (53 * hash) + getLinkSeq(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CmdRpcEnvelope parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CmdRpcEnvelope prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CmdRpcEnvelope} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CmdRpcEnvelope) + com.huangzj.cmd.gen.CmdRpcEnvelopeOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdRpcEnvelope_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdRpcEnvelope_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CmdRpcEnvelope.class, com.huangzj.cmd.gen.CmdRpcEnvelope.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CmdRpcEnvelope.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + serviceId_ = 0; + methodId_ = 0; + payload_ = com.google.protobuf.ByteString.EMPTY; + crossRet_ = 0; + linkSeq_ = 0; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CmdRpcEnvelope_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdRpcEnvelope getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CmdRpcEnvelope.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdRpcEnvelope build() { + com.huangzj.cmd.gen.CmdRpcEnvelope result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdRpcEnvelope buildPartial() { + com.huangzj.cmd.gen.CmdRpcEnvelope result = new com.huangzj.cmd.gen.CmdRpcEnvelope(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CmdRpcEnvelope result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.serviceId_ = serviceId_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.methodId_ = methodId_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.payload_ = payload_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.crossRet_ = crossRet_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.linkSeq_ = linkSeq_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CmdRpcEnvelope) { + return mergeFrom((com.huangzj.cmd.gen.CmdRpcEnvelope)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CmdRpcEnvelope other) { + if (other == com.huangzj.cmd.gen.CmdRpcEnvelope.getDefaultInstance()) return this; + if (other.getServiceId() != 0) { + setServiceId(other.getServiceId()); + } + if (other.getMethodId() != 0) { + setMethodId(other.getMethodId()); + } + if (other.getPayload() != com.google.protobuf.ByteString.EMPTY) { + setPayload(other.getPayload()); + } + if (other.getCrossRet() != 0) { + setCrossRet(other.getCrossRet()); + } + if (other.getLinkSeq() != 0) { + setLinkSeq(other.getLinkSeq()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + serviceId_ = input.readUInt32(); + bitField0_ |= 0x00000001; + break; + } // case 8 + case 16: { + methodId_ = input.readUInt32(); + bitField0_ |= 0x00000002; + break; + } // case 16 + case 26: { + payload_ = input.readBytes(); + bitField0_ |= 0x00000004; + break; + } // case 26 + case 32: { + crossRet_ = input.readInt32(); + bitField0_ |= 0x00000008; + break; + } // case 32 + case 40: { + linkSeq_ = input.readUInt32(); + bitField0_ |= 0x00000010; + break; + } // case 40 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private int serviceId_ ; + /** + * uint32 service_id = 1; + * @return The serviceId. + */ + @java.lang.Override + public int getServiceId() { + return serviceId_; + } + /** + * uint32 service_id = 1; + * @param value The serviceId to set. + * @return This builder for chaining. + */ + public Builder setServiceId(int value) { + + serviceId_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * uint32 service_id = 1; + * @return This builder for chaining. + */ + public Builder clearServiceId() { + bitField0_ = (bitField0_ & ~0x00000001); + serviceId_ = 0; + onChanged(); + return this; + } + + private int methodId_ ; + /** + * uint32 method_id = 2; + * @return The methodId. + */ + @java.lang.Override + public int getMethodId() { + return methodId_; + } + /** + * uint32 method_id = 2; + * @param value The methodId to set. + * @return This builder for chaining. + */ + public Builder setMethodId(int value) { + + methodId_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * uint32 method_id = 2; + * @return This builder for chaining. + */ + public Builder clearMethodId() { + bitField0_ = (bitField0_ & ~0x00000002); + methodId_ = 0; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString payload_ = com.google.protobuf.ByteString.EMPTY; + /** + * bytes payload = 3; + * @return The payload. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPayload() { + return payload_; + } + /** + * bytes payload = 3; + * @param value The payload to set. + * @return This builder for chaining. + */ + public Builder setPayload(com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + payload_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * bytes payload = 3; + * @return This builder for chaining. + */ + public Builder clearPayload() { + bitField0_ = (bitField0_ & ~0x00000004); + payload_ = getDefaultInstance().getPayload(); + onChanged(); + return this; + } + + private int crossRet_ ; + /** + * int32 cross_ret = 4; + * @return The crossRet. + */ + @java.lang.Override + public int getCrossRet() { + return crossRet_; + } + /** + * int32 cross_ret = 4; + * @param value The crossRet to set. + * @return This builder for chaining. + */ + public Builder setCrossRet(int value) { + + crossRet_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * int32 cross_ret = 4; + * @return This builder for chaining. + */ + public Builder clearCrossRet() { + bitField0_ = (bitField0_ & ~0x00000008); + crossRet_ = 0; + onChanged(); + return this; + } + + private int linkSeq_ ; + /** + *
+     ** 区服↔跨服链路上对齐请求与响应;客户端 TCP 可保持默认 0。 
+     * 
+ * + * uint32 link_seq = 5; + * @return The linkSeq. + */ + @java.lang.Override + public int getLinkSeq() { + return linkSeq_; + } + /** + *
+     ** 区服↔跨服链路上对齐请求与响应;客户端 TCP 可保持默认 0。 
+     * 
+ * + * uint32 link_seq = 5; + * @param value The linkSeq to set. + * @return This builder for chaining. + */ + public Builder setLinkSeq(int value) { + + linkSeq_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + /** + *
+     ** 区服↔跨服链路上对齐请求与响应;客户端 TCP 可保持默认 0。 
+     * 
+ * + * uint32 link_seq = 5; + * @return This builder for chaining. + */ + public Builder clearLinkSeq() { + bitField0_ = (bitField0_ & ~0x00000010); + linkSeq_ = 0; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CmdRpcEnvelope) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CmdRpcEnvelope) + private static final com.huangzj.cmd.gen.CmdRpcEnvelope DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CmdRpcEnvelope(); + } + + public static com.huangzj.cmd.gen.CmdRpcEnvelope getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CmdRpcEnvelope parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CmdRpcEnvelope getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpcEnvelopeOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpcEnvelopeOrBuilder.java new file mode 100644 index 0000000..7d973d4 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CmdRpcEnvelopeOrBuilder.java @@ -0,0 +1,44 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CmdRpcEnvelopeOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CmdRpcEnvelope) + com.google.protobuf.MessageOrBuilder { + + /** + * uint32 service_id = 1; + * @return The serviceId. + */ + int getServiceId(); + + /** + * uint32 method_id = 2; + * @return The methodId. + */ + int getMethodId(); + + /** + * bytes payload = 3; + * @return The payload. + */ + com.google.protobuf.ByteString getPayload(); + + /** + * int32 cross_ret = 4; + * @return The crossRet. + */ + int getCrossRet(); + + /** + *
+   ** 区服↔跨服链路上对齐请求与响应;客户端 TCP 可保持默认 0。 
+   * 
+ * + * uint32 link_seq = 5; + * @return The linkSeq. + */ + int getLinkSeq(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardCts.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardCts.java new file mode 100644 index 0000000..cc379d3 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardCts.java @@ -0,0 +1,542 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CrossForwardCts} + */ +public final class CrossForwardCts extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CrossForwardCts) + CrossForwardCtsOrBuilder { +private static final long serialVersionUID = 0L; + // Use CrossForwardCts.newBuilder() to construct. + private CrossForwardCts(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CrossForwardCts() { + trace_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CrossForwardCts(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossForwardCts.class, com.huangzj.cmd.gen.CrossForwardCts.Builder.class); + } + + public static final int TRACE_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object trace_ = ""; + /** + * string trace = 1; + * @return The trace. + */ + @java.lang.Override + public java.lang.String getTrace() { + java.lang.Object ref = trace_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + trace_ = s; + return s; + } + } + /** + * string trace = 1; + * @return The bytes for trace. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTraceBytes() { + java.lang.Object ref = trace_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + trace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(trace_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, trace_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(trace_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, trace_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CrossForwardCts)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CrossForwardCts other = (com.huangzj.cmd.gen.CrossForwardCts) obj; + + if (!getTrace() + .equals(other.getTrace())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TRACE_FIELD_NUMBER; + hash = (53 * hash) + getTrace().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CrossForwardCts parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CrossForwardCts parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossForwardCts parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CrossForwardCts prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CrossForwardCts} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CrossForwardCts) + com.huangzj.cmd.gen.CrossForwardCtsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossForwardCts.class, com.huangzj.cmd.gen.CrossForwardCts.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CrossForwardCts.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + trace_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardCts_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossForwardCts getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CrossForwardCts.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossForwardCts build() { + com.huangzj.cmd.gen.CrossForwardCts result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossForwardCts buildPartial() { + com.huangzj.cmd.gen.CrossForwardCts result = new com.huangzj.cmd.gen.CrossForwardCts(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CrossForwardCts result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.trace_ = trace_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CrossForwardCts) { + return mergeFrom((com.huangzj.cmd.gen.CrossForwardCts)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CrossForwardCts other) { + if (other == com.huangzj.cmd.gen.CrossForwardCts.getDefaultInstance()) return this; + if (!other.getTrace().isEmpty()) { + trace_ = other.trace_; + bitField0_ |= 0x00000001; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + trace_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object trace_ = ""; + /** + * string trace = 1; + * @return The trace. + */ + public java.lang.String getTrace() { + java.lang.Object ref = trace_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + trace_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string trace = 1; + * @return The bytes for trace. + */ + public com.google.protobuf.ByteString + getTraceBytes() { + java.lang.Object ref = trace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + trace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string trace = 1; + * @param value The trace to set. + * @return This builder for chaining. + */ + public Builder setTrace( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + trace_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * string trace = 1; + * @return This builder for chaining. + */ + public Builder clearTrace() { + trace_ = getDefaultInstance().getTrace(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * string trace = 1; + * @param value The bytes for trace to set. + * @return This builder for chaining. + */ + public Builder setTraceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + trace_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CrossForwardCts) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CrossForwardCts) + private static final com.huangzj.cmd.gen.CrossForwardCts DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CrossForwardCts(); + } + + public static com.huangzj.cmd.gen.CrossForwardCts getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CrossForwardCts parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossForwardCts getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardCtsOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardCtsOrBuilder.java new file mode 100644 index 0000000..1bc8318 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardCtsOrBuilder.java @@ -0,0 +1,22 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CrossForwardCtsOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CrossForwardCts) + com.google.protobuf.MessageOrBuilder { + + /** + * string trace = 1; + * @return The trace. + */ + java.lang.String getTrace(); + /** + * string trace = 1; + * @return The bytes for trace. + */ + com.google.protobuf.ByteString + getTraceBytes(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardStc.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardStc.java new file mode 100644 index 0000000..ee6c9d9 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardStc.java @@ -0,0 +1,609 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CrossForwardStc} + */ +public final class CrossForwardStc extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CrossForwardStc) + CrossForwardStcOrBuilder { +private static final long serialVersionUID = 0L; + // Use CrossForwardStc.newBuilder() to construct. + private CrossForwardStc(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CrossForwardStc() { + trace_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CrossForwardStc(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossForwardStc.class, com.huangzj.cmd.gen.CrossForwardStc.Builder.class); + } + + public static final int TRACE_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object trace_ = ""; + /** + * string trace = 1; + * @return The trace. + */ + @java.lang.Override + public java.lang.String getTrace() { + java.lang.Object ref = trace_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + trace_ = s; + return s; + } + } + /** + * string trace = 1; + * @return The bytes for trace. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTraceBytes() { + java.lang.Object ref = trace_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + trace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CROSS_TIME_MS_FIELD_NUMBER = 2; + private long crossTimeMs_ = 0L; + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + @java.lang.Override + public long getCrossTimeMs() { + return crossTimeMs_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(trace_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, trace_); + } + if (crossTimeMs_ != 0L) { + output.writeInt64(2, crossTimeMs_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(trace_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, trace_); + } + if (crossTimeMs_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(2, crossTimeMs_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CrossForwardStc)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CrossForwardStc other = (com.huangzj.cmd.gen.CrossForwardStc) obj; + + if (!getTrace() + .equals(other.getTrace())) return false; + if (getCrossTimeMs() + != other.getCrossTimeMs()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TRACE_FIELD_NUMBER; + hash = (53 * hash) + getTrace().hashCode(); + hash = (37 * hash) + CROSS_TIME_MS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getCrossTimeMs()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CrossForwardStc parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CrossForwardStc parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossForwardStc parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CrossForwardStc prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CrossForwardStc} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CrossForwardStc) + com.huangzj.cmd.gen.CrossForwardStcOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossForwardStc.class, com.huangzj.cmd.gen.CrossForwardStc.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CrossForwardStc.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + trace_ = ""; + crossTimeMs_ = 0L; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossForwardStc_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossForwardStc getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CrossForwardStc.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossForwardStc build() { + com.huangzj.cmd.gen.CrossForwardStc result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossForwardStc buildPartial() { + com.huangzj.cmd.gen.CrossForwardStc result = new com.huangzj.cmd.gen.CrossForwardStc(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CrossForwardStc result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.trace_ = trace_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.crossTimeMs_ = crossTimeMs_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CrossForwardStc) { + return mergeFrom((com.huangzj.cmd.gen.CrossForwardStc)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CrossForwardStc other) { + if (other == com.huangzj.cmd.gen.CrossForwardStc.getDefaultInstance()) return this; + if (!other.getTrace().isEmpty()) { + trace_ = other.trace_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.getCrossTimeMs() != 0L) { + setCrossTimeMs(other.getCrossTimeMs()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + trace_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 16: { + crossTimeMs_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 16 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object trace_ = ""; + /** + * string trace = 1; + * @return The trace. + */ + public java.lang.String getTrace() { + java.lang.Object ref = trace_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + trace_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string trace = 1; + * @return The bytes for trace. + */ + public com.google.protobuf.ByteString + getTraceBytes() { + java.lang.Object ref = trace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + trace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string trace = 1; + * @param value The trace to set. + * @return This builder for chaining. + */ + public Builder setTrace( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + trace_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * string trace = 1; + * @return This builder for chaining. + */ + public Builder clearTrace() { + trace_ = getDefaultInstance().getTrace(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * string trace = 1; + * @param value The bytes for trace to set. + * @return This builder for chaining. + */ + public Builder setTraceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + trace_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long crossTimeMs_ ; + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + @java.lang.Override + public long getCrossTimeMs() { + return crossTimeMs_; + } + /** + * int64 cross_time_ms = 2; + * @param value The crossTimeMs to set. + * @return This builder for chaining. + */ + public Builder setCrossTimeMs(long value) { + + crossTimeMs_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * int64 cross_time_ms = 2; + * @return This builder for chaining. + */ + public Builder clearCrossTimeMs() { + bitField0_ = (bitField0_ & ~0x00000002); + crossTimeMs_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CrossForwardStc) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CrossForwardStc) + private static final com.huangzj.cmd.gen.CrossForwardStc DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CrossForwardStc(); + } + + public static com.huangzj.cmd.gen.CrossForwardStc getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CrossForwardStc parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossForwardStc getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardStcOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardStcOrBuilder.java new file mode 100644 index 0000000..8be2c55 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossForwardStcOrBuilder.java @@ -0,0 +1,28 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CrossForwardStcOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CrossForwardStc) + com.google.protobuf.MessageOrBuilder { + + /** + * string trace = 1; + * @return The trace. + */ + java.lang.String getTrace(); + /** + * string trace = 1; + * @return The bytes for trace. + */ + com.google.protobuf.ByteString + getTraceBytes(); + + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + long getCrossTimeMs(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatCts.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatCts.java new file mode 100644 index 0000000..d0b215b --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatCts.java @@ -0,0 +1,473 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CrossLinkHeartbeatCts} + */ +public final class CrossLinkHeartbeatCts extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CrossLinkHeartbeatCts) + CrossLinkHeartbeatCtsOrBuilder { +private static final long serialVersionUID = 0L; + // Use CrossLinkHeartbeatCts.newBuilder() to construct. + private CrossLinkHeartbeatCts(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CrossLinkHeartbeatCts() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CrossLinkHeartbeatCts(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossLinkHeartbeatCts.class, com.huangzj.cmd.gen.CrossLinkHeartbeatCts.Builder.class); + } + + public static final int CLIENT_TIME_MS_FIELD_NUMBER = 1; + private long clientTimeMs_ = 0L; + /** + * int64 client_time_ms = 1; + * @return The clientTimeMs. + */ + @java.lang.Override + public long getClientTimeMs() { + return clientTimeMs_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (clientTimeMs_ != 0L) { + output.writeInt64(1, clientTimeMs_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (clientTimeMs_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(1, clientTimeMs_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CrossLinkHeartbeatCts)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CrossLinkHeartbeatCts other = (com.huangzj.cmd.gen.CrossLinkHeartbeatCts) obj; + + if (getClientTimeMs() + != other.getClientTimeMs()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + CLIENT_TIME_MS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getClientTimeMs()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CrossLinkHeartbeatCts prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CrossLinkHeartbeatCts} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CrossLinkHeartbeatCts) + com.huangzj.cmd.gen.CrossLinkHeartbeatCtsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossLinkHeartbeatCts.class, com.huangzj.cmd.gen.CrossLinkHeartbeatCts.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CrossLinkHeartbeatCts.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + clientTimeMs_ = 0L; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatCts_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkHeartbeatCts getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CrossLinkHeartbeatCts.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkHeartbeatCts build() { + com.huangzj.cmd.gen.CrossLinkHeartbeatCts result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkHeartbeatCts buildPartial() { + com.huangzj.cmd.gen.CrossLinkHeartbeatCts result = new com.huangzj.cmd.gen.CrossLinkHeartbeatCts(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CrossLinkHeartbeatCts result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.clientTimeMs_ = clientTimeMs_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CrossLinkHeartbeatCts) { + return mergeFrom((com.huangzj.cmd.gen.CrossLinkHeartbeatCts)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CrossLinkHeartbeatCts other) { + if (other == com.huangzj.cmd.gen.CrossLinkHeartbeatCts.getDefaultInstance()) return this; + if (other.getClientTimeMs() != 0L) { + setClientTimeMs(other.getClientTimeMs()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + clientTimeMs_ = input.readInt64(); + bitField0_ |= 0x00000001; + break; + } // case 8 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private long clientTimeMs_ ; + /** + * int64 client_time_ms = 1; + * @return The clientTimeMs. + */ + @java.lang.Override + public long getClientTimeMs() { + return clientTimeMs_; + } + /** + * int64 client_time_ms = 1; + * @param value The clientTimeMs to set. + * @return This builder for chaining. + */ + public Builder setClientTimeMs(long value) { + + clientTimeMs_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * int64 client_time_ms = 1; + * @return This builder for chaining. + */ + public Builder clearClientTimeMs() { + bitField0_ = (bitField0_ & ~0x00000001); + clientTimeMs_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CrossLinkHeartbeatCts) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CrossLinkHeartbeatCts) + private static final com.huangzj.cmd.gen.CrossLinkHeartbeatCts DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CrossLinkHeartbeatCts(); + } + + public static com.huangzj.cmd.gen.CrossLinkHeartbeatCts getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CrossLinkHeartbeatCts parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkHeartbeatCts getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatCtsOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatCtsOrBuilder.java new file mode 100644 index 0000000..53fa014 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatCtsOrBuilder.java @@ -0,0 +1,16 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CrossLinkHeartbeatCtsOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CrossLinkHeartbeatCts) + com.google.protobuf.MessageOrBuilder { + + /** + * int64 client_time_ms = 1; + * @return The clientTimeMs. + */ + long getClientTimeMs(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatStc.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatStc.java new file mode 100644 index 0000000..fd23358 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatStc.java @@ -0,0 +1,540 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CrossLinkHeartbeatStc} + */ +public final class CrossLinkHeartbeatStc extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CrossLinkHeartbeatStc) + CrossLinkHeartbeatStcOrBuilder { +private static final long serialVersionUID = 0L; + // Use CrossLinkHeartbeatStc.newBuilder() to construct. + private CrossLinkHeartbeatStc(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CrossLinkHeartbeatStc() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CrossLinkHeartbeatStc(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossLinkHeartbeatStc.class, com.huangzj.cmd.gen.CrossLinkHeartbeatStc.Builder.class); + } + + public static final int CLIENT_TIME_MS_FIELD_NUMBER = 1; + private long clientTimeMs_ = 0L; + /** + * int64 client_time_ms = 1; + * @return The clientTimeMs. + */ + @java.lang.Override + public long getClientTimeMs() { + return clientTimeMs_; + } + + public static final int CROSS_TIME_MS_FIELD_NUMBER = 2; + private long crossTimeMs_ = 0L; + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + @java.lang.Override + public long getCrossTimeMs() { + return crossTimeMs_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (clientTimeMs_ != 0L) { + output.writeInt64(1, clientTimeMs_); + } + if (crossTimeMs_ != 0L) { + output.writeInt64(2, crossTimeMs_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (clientTimeMs_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(1, clientTimeMs_); + } + if (crossTimeMs_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(2, crossTimeMs_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CrossLinkHeartbeatStc)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CrossLinkHeartbeatStc other = (com.huangzj.cmd.gen.CrossLinkHeartbeatStc) obj; + + if (getClientTimeMs() + != other.getClientTimeMs()) return false; + if (getCrossTimeMs() + != other.getCrossTimeMs()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + CLIENT_TIME_MS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getClientTimeMs()); + hash = (37 * hash) + CROSS_TIME_MS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getCrossTimeMs()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CrossLinkHeartbeatStc prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CrossLinkHeartbeatStc} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CrossLinkHeartbeatStc) + com.huangzj.cmd.gen.CrossLinkHeartbeatStcOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossLinkHeartbeatStc.class, com.huangzj.cmd.gen.CrossLinkHeartbeatStc.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CrossLinkHeartbeatStc.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + clientTimeMs_ = 0L; + crossTimeMs_ = 0L; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkHeartbeatStc_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkHeartbeatStc getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CrossLinkHeartbeatStc.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkHeartbeatStc build() { + com.huangzj.cmd.gen.CrossLinkHeartbeatStc result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkHeartbeatStc buildPartial() { + com.huangzj.cmd.gen.CrossLinkHeartbeatStc result = new com.huangzj.cmd.gen.CrossLinkHeartbeatStc(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CrossLinkHeartbeatStc result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.clientTimeMs_ = clientTimeMs_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.crossTimeMs_ = crossTimeMs_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CrossLinkHeartbeatStc) { + return mergeFrom((com.huangzj.cmd.gen.CrossLinkHeartbeatStc)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CrossLinkHeartbeatStc other) { + if (other == com.huangzj.cmd.gen.CrossLinkHeartbeatStc.getDefaultInstance()) return this; + if (other.getClientTimeMs() != 0L) { + setClientTimeMs(other.getClientTimeMs()); + } + if (other.getCrossTimeMs() != 0L) { + setCrossTimeMs(other.getCrossTimeMs()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + clientTimeMs_ = input.readInt64(); + bitField0_ |= 0x00000001; + break; + } // case 8 + case 16: { + crossTimeMs_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 16 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private long clientTimeMs_ ; + /** + * int64 client_time_ms = 1; + * @return The clientTimeMs. + */ + @java.lang.Override + public long getClientTimeMs() { + return clientTimeMs_; + } + /** + * int64 client_time_ms = 1; + * @param value The clientTimeMs to set. + * @return This builder for chaining. + */ + public Builder setClientTimeMs(long value) { + + clientTimeMs_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * int64 client_time_ms = 1; + * @return This builder for chaining. + */ + public Builder clearClientTimeMs() { + bitField0_ = (bitField0_ & ~0x00000001); + clientTimeMs_ = 0L; + onChanged(); + return this; + } + + private long crossTimeMs_ ; + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + @java.lang.Override + public long getCrossTimeMs() { + return crossTimeMs_; + } + /** + * int64 cross_time_ms = 2; + * @param value The crossTimeMs to set. + * @return This builder for chaining. + */ + public Builder setCrossTimeMs(long value) { + + crossTimeMs_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * int64 cross_time_ms = 2; + * @return This builder for chaining. + */ + public Builder clearCrossTimeMs() { + bitField0_ = (bitField0_ & ~0x00000002); + crossTimeMs_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CrossLinkHeartbeatStc) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CrossLinkHeartbeatStc) + private static final com.huangzj.cmd.gen.CrossLinkHeartbeatStc DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CrossLinkHeartbeatStc(); + } + + public static com.huangzj.cmd.gen.CrossLinkHeartbeatStc getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CrossLinkHeartbeatStc parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkHeartbeatStc getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatStcOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatStcOrBuilder.java new file mode 100644 index 0000000..10c576e --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkHeartbeatStcOrBuilder.java @@ -0,0 +1,22 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CrossLinkHeartbeatStcOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CrossLinkHeartbeatStc) + com.google.protobuf.MessageOrBuilder { + + /** + * int64 client_time_ms = 1; + * @return The clientTimeMs. + */ + long getClientTimeMs(); + + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + long getCrossTimeMs(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterCts.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterCts.java new file mode 100644 index 0000000..ee91807 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterCts.java @@ -0,0 +1,678 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CrossLinkRegisterCts} + */ +public final class CrossLinkRegisterCts extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CrossLinkRegisterCts) + CrossLinkRegisterCtsOrBuilder { +private static final long serialVersionUID = 0L; + // Use CrossLinkRegisterCts.newBuilder() to construct. + private CrossLinkRegisterCts(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CrossLinkRegisterCts() { + serverId_ = ""; + token_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CrossLinkRegisterCts(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossLinkRegisterCts.class, com.huangzj.cmd.gen.CrossLinkRegisterCts.Builder.class); + } + + public static final int SERVER_ID_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object serverId_ = ""; + /** + * string server_id = 1; + * @return The serverId. + */ + @java.lang.Override + public java.lang.String getServerId() { + java.lang.Object ref = serverId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + serverId_ = s; + return s; + } + } + /** + * string server_id = 1; + * @return The bytes for serverId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getServerIdBytes() { + java.lang.Object ref = serverId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + serverId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TOKEN_FIELD_NUMBER = 2; + @SuppressWarnings("serial") + private volatile java.lang.Object token_ = ""; + /** + * string token = 2; + * @return The token. + */ + @java.lang.Override + public java.lang.String getToken() { + java.lang.Object ref = token_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + token_ = s; + return s; + } + } + /** + * string token = 2; + * @return The bytes for token. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTokenBytes() { + java.lang.Object ref = token_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + token_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(serverId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, serverId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(token_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, token_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(serverId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, serverId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(token_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, token_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CrossLinkRegisterCts)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CrossLinkRegisterCts other = (com.huangzj.cmd.gen.CrossLinkRegisterCts) obj; + + if (!getServerId() + .equals(other.getServerId())) return false; + if (!getToken() + .equals(other.getToken())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SERVER_ID_FIELD_NUMBER; + hash = (53 * hash) + getServerId().hashCode(); + hash = (37 * hash) + TOKEN_FIELD_NUMBER; + hash = (53 * hash) + getToken().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterCts parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CrossLinkRegisterCts prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CrossLinkRegisterCts} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CrossLinkRegisterCts) + com.huangzj.cmd.gen.CrossLinkRegisterCtsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossLinkRegisterCts.class, com.huangzj.cmd.gen.CrossLinkRegisterCts.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CrossLinkRegisterCts.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + serverId_ = ""; + token_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterCts_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkRegisterCts getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CrossLinkRegisterCts.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkRegisterCts build() { + com.huangzj.cmd.gen.CrossLinkRegisterCts result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkRegisterCts buildPartial() { + com.huangzj.cmd.gen.CrossLinkRegisterCts result = new com.huangzj.cmd.gen.CrossLinkRegisterCts(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CrossLinkRegisterCts result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.serverId_ = serverId_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.token_ = token_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CrossLinkRegisterCts) { + return mergeFrom((com.huangzj.cmd.gen.CrossLinkRegisterCts)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CrossLinkRegisterCts other) { + if (other == com.huangzj.cmd.gen.CrossLinkRegisterCts.getDefaultInstance()) return this; + if (!other.getServerId().isEmpty()) { + serverId_ = other.serverId_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (!other.getToken().isEmpty()) { + token_ = other.token_; + bitField0_ |= 0x00000002; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + serverId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: { + token_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } // case 18 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object serverId_ = ""; + /** + * string server_id = 1; + * @return The serverId. + */ + public java.lang.String getServerId() { + java.lang.Object ref = serverId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + serverId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string server_id = 1; + * @return The bytes for serverId. + */ + public com.google.protobuf.ByteString + getServerIdBytes() { + java.lang.Object ref = serverId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + serverId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string server_id = 1; + * @param value The serverId to set. + * @return This builder for chaining. + */ + public Builder setServerId( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + serverId_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * string server_id = 1; + * @return This builder for chaining. + */ + public Builder clearServerId() { + serverId_ = getDefaultInstance().getServerId(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * string server_id = 1; + * @param value The bytes for serverId to set. + * @return This builder for chaining. + */ + public Builder setServerIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + serverId_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private java.lang.Object token_ = ""; + /** + * string token = 2; + * @return The token. + */ + public java.lang.String getToken() { + java.lang.Object ref = token_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + token_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string token = 2; + * @return The bytes for token. + */ + public com.google.protobuf.ByteString + getTokenBytes() { + java.lang.Object ref = token_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + token_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string token = 2; + * @param value The token to set. + * @return This builder for chaining. + */ + public Builder setToken( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + token_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * string token = 2; + * @return This builder for chaining. + */ + public Builder clearToken() { + token_ = getDefaultInstance().getToken(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + * string token = 2; + * @param value The bytes for token to set. + * @return This builder for chaining. + */ + public Builder setTokenBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + token_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CrossLinkRegisterCts) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CrossLinkRegisterCts) + private static final com.huangzj.cmd.gen.CrossLinkRegisterCts DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CrossLinkRegisterCts(); + } + + public static com.huangzj.cmd.gen.CrossLinkRegisterCts getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CrossLinkRegisterCts parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkRegisterCts getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterCtsOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterCtsOrBuilder.java new file mode 100644 index 0000000..da15de7 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterCtsOrBuilder.java @@ -0,0 +1,34 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CrossLinkRegisterCtsOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CrossLinkRegisterCts) + com.google.protobuf.MessageOrBuilder { + + /** + * string server_id = 1; + * @return The serverId. + */ + java.lang.String getServerId(); + /** + * string server_id = 1; + * @return The bytes for serverId. + */ + com.google.protobuf.ByteString + getServerIdBytes(); + + /** + * string token = 2; + * @return The token. + */ + java.lang.String getToken(); + /** + * string token = 2; + * @return The bytes for token. + */ + com.google.protobuf.ByteString + getTokenBytes(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterStc.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterStc.java new file mode 100644 index 0000000..d384cb5 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterStc.java @@ -0,0 +1,609 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CrossLinkRegisterStc} + */ +public final class CrossLinkRegisterStc extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CrossLinkRegisterStc) + CrossLinkRegisterStcOrBuilder { +private static final long serialVersionUID = 0L; + // Use CrossLinkRegisterStc.newBuilder() to construct. + private CrossLinkRegisterStc(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CrossLinkRegisterStc() { + message_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CrossLinkRegisterStc(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossLinkRegisterStc.class, com.huangzj.cmd.gen.CrossLinkRegisterStc.Builder.class); + } + + public static final int OK_FIELD_NUMBER = 1; + private boolean ok_ = false; + /** + * bool ok = 1; + * @return The ok. + */ + @java.lang.Override + public boolean getOk() { + return ok_; + } + + public static final int MESSAGE_FIELD_NUMBER = 2; + @SuppressWarnings("serial") + private volatile java.lang.Object message_ = ""; + /** + * string message = 2; + * @return The message. + */ + @java.lang.Override + public java.lang.String getMessage() { + java.lang.Object ref = message_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + message_ = s; + return s; + } + } + /** + * string message = 2; + * @return The bytes for message. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getMessageBytes() { + java.lang.Object ref = message_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (ok_ != false) { + output.writeBool(1, ok_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(message_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, message_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (ok_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, ok_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(message_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, message_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CrossLinkRegisterStc)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CrossLinkRegisterStc other = (com.huangzj.cmd.gen.CrossLinkRegisterStc) obj; + + if (getOk() + != other.getOk()) return false; + if (!getMessage() + .equals(other.getMessage())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + OK_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getOk()); + hash = (37 * hash) + MESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getMessage().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossLinkRegisterStc parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CrossLinkRegisterStc prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CrossLinkRegisterStc} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CrossLinkRegisterStc) + com.huangzj.cmd.gen.CrossLinkRegisterStcOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossLinkRegisterStc.class, com.huangzj.cmd.gen.CrossLinkRegisterStc.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CrossLinkRegisterStc.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + ok_ = false; + message_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossLinkRegisterStc_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkRegisterStc getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CrossLinkRegisterStc.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkRegisterStc build() { + com.huangzj.cmd.gen.CrossLinkRegisterStc result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkRegisterStc buildPartial() { + com.huangzj.cmd.gen.CrossLinkRegisterStc result = new com.huangzj.cmd.gen.CrossLinkRegisterStc(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CrossLinkRegisterStc result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.ok_ = ok_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.message_ = message_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CrossLinkRegisterStc) { + return mergeFrom((com.huangzj.cmd.gen.CrossLinkRegisterStc)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CrossLinkRegisterStc other) { + if (other == com.huangzj.cmd.gen.CrossLinkRegisterStc.getDefaultInstance()) return this; + if (other.getOk() != false) { + setOk(other.getOk()); + } + if (!other.getMessage().isEmpty()) { + message_ = other.message_; + bitField0_ |= 0x00000002; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + ok_ = input.readBool(); + bitField0_ |= 0x00000001; + break; + } // case 8 + case 18: { + message_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } // case 18 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private boolean ok_ ; + /** + * bool ok = 1; + * @return The ok. + */ + @java.lang.Override + public boolean getOk() { + return ok_; + } + /** + * bool ok = 1; + * @param value The ok to set. + * @return This builder for chaining. + */ + public Builder setOk(boolean value) { + + ok_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * bool ok = 1; + * @return This builder for chaining. + */ + public Builder clearOk() { + bitField0_ = (bitField0_ & ~0x00000001); + ok_ = false; + onChanged(); + return this; + } + + private java.lang.Object message_ = ""; + /** + * string message = 2; + * @return The message. + */ + public java.lang.String getMessage() { + java.lang.Object ref = message_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + message_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string message = 2; + * @return The bytes for message. + */ + public com.google.protobuf.ByteString + getMessageBytes() { + java.lang.Object ref = message_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string message = 2; + * @param value The message to set. + * @return This builder for chaining. + */ + public Builder setMessage( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + message_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * string message = 2; + * @return This builder for chaining. + */ + public Builder clearMessage() { + message_ = getDefaultInstance().getMessage(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + * string message = 2; + * @param value The bytes for message to set. + * @return This builder for chaining. + */ + public Builder setMessageBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + message_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CrossLinkRegisterStc) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CrossLinkRegisterStc) + private static final com.huangzj.cmd.gen.CrossLinkRegisterStc DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CrossLinkRegisterStc(); + } + + public static com.huangzj.cmd.gen.CrossLinkRegisterStc getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CrossLinkRegisterStc parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossLinkRegisterStc getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterStcOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterStcOrBuilder.java new file mode 100644 index 0000000..10f94f8 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossLinkRegisterStcOrBuilder.java @@ -0,0 +1,28 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CrossLinkRegisterStcOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CrossLinkRegisterStc) + com.google.protobuf.MessageOrBuilder { + + /** + * bool ok = 1; + * @return The ok. + */ + boolean getOk(); + + /** + * string message = 2; + * @return The message. + */ + java.lang.String getMessage(); + /** + * string message = 2; + * @return The bytes for message. + */ + com.google.protobuf.ByteString + getMessageBytes(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyCts.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyCts.java new file mode 100644 index 0000000..5e421e2 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyCts.java @@ -0,0 +1,542 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CrossProxyCts} + */ +public final class CrossProxyCts extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CrossProxyCts) + CrossProxyCtsOrBuilder { +private static final long serialVersionUID = 0L; + // Use CrossProxyCts.newBuilder() to construct. + private CrossProxyCts(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CrossProxyCts() { + trace_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CrossProxyCts(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossProxyCts.class, com.huangzj.cmd.gen.CrossProxyCts.Builder.class); + } + + public static final int TRACE_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object trace_ = ""; + /** + * string trace = 1; + * @return The trace. + */ + @java.lang.Override + public java.lang.String getTrace() { + java.lang.Object ref = trace_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + trace_ = s; + return s; + } + } + /** + * string trace = 1; + * @return The bytes for trace. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTraceBytes() { + java.lang.Object ref = trace_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + trace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(trace_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, trace_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(trace_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, trace_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CrossProxyCts)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CrossProxyCts other = (com.huangzj.cmd.gen.CrossProxyCts) obj; + + if (!getTrace() + .equals(other.getTrace())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TRACE_FIELD_NUMBER; + hash = (53 * hash) + getTrace().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CrossProxyCts parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CrossProxyCts parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossProxyCts parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CrossProxyCts prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CrossProxyCts} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CrossProxyCts) + com.huangzj.cmd.gen.CrossProxyCtsOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyCts_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyCts_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossProxyCts.class, com.huangzj.cmd.gen.CrossProxyCts.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CrossProxyCts.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + trace_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyCts_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossProxyCts getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CrossProxyCts.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossProxyCts build() { + com.huangzj.cmd.gen.CrossProxyCts result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossProxyCts buildPartial() { + com.huangzj.cmd.gen.CrossProxyCts result = new com.huangzj.cmd.gen.CrossProxyCts(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CrossProxyCts result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.trace_ = trace_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CrossProxyCts) { + return mergeFrom((com.huangzj.cmd.gen.CrossProxyCts)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CrossProxyCts other) { + if (other == com.huangzj.cmd.gen.CrossProxyCts.getDefaultInstance()) return this; + if (!other.getTrace().isEmpty()) { + trace_ = other.trace_; + bitField0_ |= 0x00000001; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + trace_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object trace_ = ""; + /** + * string trace = 1; + * @return The trace. + */ + public java.lang.String getTrace() { + java.lang.Object ref = trace_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + trace_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string trace = 1; + * @return The bytes for trace. + */ + public com.google.protobuf.ByteString + getTraceBytes() { + java.lang.Object ref = trace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + trace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string trace = 1; + * @param value The trace to set. + * @return This builder for chaining. + */ + public Builder setTrace( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + trace_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * string trace = 1; + * @return This builder for chaining. + */ + public Builder clearTrace() { + trace_ = getDefaultInstance().getTrace(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * string trace = 1; + * @param value The bytes for trace to set. + * @return This builder for chaining. + */ + public Builder setTraceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + trace_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CrossProxyCts) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CrossProxyCts) + private static final com.huangzj.cmd.gen.CrossProxyCts DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CrossProxyCts(); + } + + public static com.huangzj.cmd.gen.CrossProxyCts getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CrossProxyCts parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossProxyCts getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyCtsOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyCtsOrBuilder.java new file mode 100644 index 0000000..ab68cec --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyCtsOrBuilder.java @@ -0,0 +1,22 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CrossProxyCtsOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CrossProxyCts) + com.google.protobuf.MessageOrBuilder { + + /** + * string trace = 1; + * @return The trace. + */ + java.lang.String getTrace(); + /** + * string trace = 1; + * @return The bytes for trace. + */ + com.google.protobuf.ByteString + getTraceBytes(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyStc.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyStc.java new file mode 100644 index 0000000..cbded66 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyStc.java @@ -0,0 +1,773 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf type {@code demo.cmd.CrossProxyStc} + */ +public final class CrossProxyStc extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:demo.cmd.CrossProxyStc) + CrossProxyStcOrBuilder { +private static final long serialVersionUID = 0L; + // Use CrossProxyStc.newBuilder() to construct. + private CrossProxyStc(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private CrossProxyStc() { + trace_ = ""; + serverNote_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new CrossProxyStc(); + } + + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossProxyStc.class, com.huangzj.cmd.gen.CrossProxyStc.Builder.class); + } + + public static final int TRACE_FIELD_NUMBER = 1; + @SuppressWarnings("serial") + private volatile java.lang.Object trace_ = ""; + /** + * string trace = 1; + * @return The trace. + */ + @java.lang.Override + public java.lang.String getTrace() { + java.lang.Object ref = trace_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + trace_ = s; + return s; + } + } + /** + * string trace = 1; + * @return The bytes for trace. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getTraceBytes() { + java.lang.Object ref = trace_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + trace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CROSS_TIME_MS_FIELD_NUMBER = 2; + private long crossTimeMs_ = 0L; + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + @java.lang.Override + public long getCrossTimeMs() { + return crossTimeMs_; + } + + public static final int SERVER_NOTE_FIELD_NUMBER = 3; + @SuppressWarnings("serial") + private volatile java.lang.Object serverNote_ = ""; + /** + *
+   ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+   * 
+ * + * string server_note = 3; + * @return The serverNote. + */ + @java.lang.Override + public java.lang.String getServerNote() { + java.lang.Object ref = serverNote_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + serverNote_ = s; + return s; + } + } + /** + *
+   ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+   * 
+ * + * string server_note = 3; + * @return The bytes for serverNote. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getServerNoteBytes() { + java.lang.Object ref = serverNote_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + serverNote_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(trace_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, trace_); + } + if (crossTimeMs_ != 0L) { + output.writeInt64(2, crossTimeMs_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(serverNote_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, serverNote_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(trace_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, trace_); + } + if (crossTimeMs_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(2, crossTimeMs_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(serverNote_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, serverNote_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.huangzj.cmd.gen.CrossProxyStc)) { + return super.equals(obj); + } + com.huangzj.cmd.gen.CrossProxyStc other = (com.huangzj.cmd.gen.CrossProxyStc) obj; + + if (!getTrace() + .equals(other.getTrace())) return false; + if (getCrossTimeMs() + != other.getCrossTimeMs()) return false; + if (!getServerNote() + .equals(other.getServerNote())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TRACE_FIELD_NUMBER; + hash = (53 * hash) + getTrace().hashCode(); + hash = (37 * hash) + CROSS_TIME_MS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getCrossTimeMs()); + hash = (37 * hash) + SERVER_NOTE_FIELD_NUMBER; + hash = (53 * hash) + getServerNote().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + public static com.huangzj.cmd.gen.CrossProxyStc parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + + public static com.huangzj.cmd.gen.CrossProxyStc parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static com.huangzj.cmd.gen.CrossProxyStc parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(com.huangzj.cmd.gen.CrossProxyStc prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code demo.cmd.CrossProxyStc} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:demo.cmd.CrossProxyStc) + com.huangzj.cmd.gen.CrossProxyStcOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyStc_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyStc_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.huangzj.cmd.gen.CrossProxyStc.class, com.huangzj.cmd.gen.CrossProxyStc.Builder.class); + } + + // Construct using com.huangzj.cmd.gen.CrossProxyStc.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + trace_ = ""; + crossTimeMs_ = 0L; + serverNote_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return com.huangzj.cmd.gen.CmdRpc.internal_static_demo_cmd_CrossProxyStc_descriptor; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossProxyStc getDefaultInstanceForType() { + return com.huangzj.cmd.gen.CrossProxyStc.getDefaultInstance(); + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossProxyStc build() { + com.huangzj.cmd.gen.CrossProxyStc result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossProxyStc buildPartial() { + com.huangzj.cmd.gen.CrossProxyStc result = new com.huangzj.cmd.gen.CrossProxyStc(this); + if (bitField0_ != 0) { buildPartial0(result); } + onBuilt(); + return result; + } + + private void buildPartial0(com.huangzj.cmd.gen.CrossProxyStc result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.trace_ = trace_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.crossTimeMs_ = crossTimeMs_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.serverNote_ = serverNote_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.huangzj.cmd.gen.CrossProxyStc) { + return mergeFrom((com.huangzj.cmd.gen.CrossProxyStc)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.huangzj.cmd.gen.CrossProxyStc other) { + if (other == com.huangzj.cmd.gen.CrossProxyStc.getDefaultInstance()) return this; + if (!other.getTrace().isEmpty()) { + trace_ = other.trace_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.getCrossTimeMs() != 0L) { + setCrossTimeMs(other.getCrossTimeMs()); + } + if (!other.getServerNote().isEmpty()) { + serverNote_ = other.serverNote_; + bitField0_ |= 0x00000004; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + trace_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 16: { + crossTimeMs_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 16 + case 26: { + serverNote_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } // case 26 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int bitField0_; + + private java.lang.Object trace_ = ""; + /** + * string trace = 1; + * @return The trace. + */ + public java.lang.String getTrace() { + java.lang.Object ref = trace_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + trace_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string trace = 1; + * @return The bytes for trace. + */ + public com.google.protobuf.ByteString + getTraceBytes() { + java.lang.Object ref = trace_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + trace_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string trace = 1; + * @param value The trace to set. + * @return This builder for chaining. + */ + public Builder setTrace( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + trace_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * string trace = 1; + * @return This builder for chaining. + */ + public Builder clearTrace() { + trace_ = getDefaultInstance().getTrace(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * string trace = 1; + * @param value The bytes for trace to set. + * @return This builder for chaining. + */ + public Builder setTraceBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + trace_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long crossTimeMs_ ; + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + @java.lang.Override + public long getCrossTimeMs() { + return crossTimeMs_; + } + /** + * int64 cross_time_ms = 2; + * @param value The crossTimeMs to set. + * @return This builder for chaining. + */ + public Builder setCrossTimeMs(long value) { + + crossTimeMs_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * int64 cross_time_ms = 2; + * @return This builder for chaining. + */ + public Builder clearCrossTimeMs() { + bitField0_ = (bitField0_ & ~0x00000002); + crossTimeMs_ = 0L; + onChanged(); + return this; + } + + private java.lang.Object serverNote_ = ""; + /** + *
+     ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+     * 
+ * + * string server_note = 3; + * @return The serverNote. + */ + public java.lang.String getServerNote() { + java.lang.Object ref = serverNote_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + serverNote_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + *
+     ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+     * 
+ * + * string server_note = 3; + * @return The bytes for serverNote. + */ + public com.google.protobuf.ByteString + getServerNoteBytes() { + java.lang.Object ref = serverNote_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + serverNote_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + *
+     ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+     * 
+ * + * string server_note = 3; + * @param value The serverNote to set. + * @return This builder for chaining. + */ + public Builder setServerNote( + java.lang.String value) { + if (value == null) { throw new NullPointerException(); } + serverNote_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + *
+     ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+     * 
+ * + * string server_note = 3; + * @return This builder for chaining. + */ + public Builder clearServerNote() { + serverNote_ = getDefaultInstance().getServerNote(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + *
+     ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+     * 
+ * + * string server_note = 3; + * @param value The bytes for serverNote to set. + * @return This builder for chaining. + */ + public Builder setServerNoteBytes( + com.google.protobuf.ByteString value) { + if (value == null) { throw new NullPointerException(); } + checkByteStringIsUtf8(value); + serverNote_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:demo.cmd.CrossProxyStc) + } + + // @@protoc_insertion_point(class_scope:demo.cmd.CrossProxyStc) + private static final com.huangzj.cmd.gen.CrossProxyStc DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new com.huangzj.cmd.gen.CrossProxyStc(); + } + + public static com.huangzj.cmd.gen.CrossProxyStc getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CrossProxyStc parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.huangzj.cmd.gen.CrossProxyStc getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyStcOrBuilder.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyStcOrBuilder.java new file mode 100644 index 0000000..7b7df56 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/CrossProxyStcOrBuilder.java @@ -0,0 +1,48 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public interface CrossProxyStcOrBuilder extends + // @@protoc_insertion_point(interface_extends:demo.cmd.CrossProxyStc) + com.google.protobuf.MessageOrBuilder { + + /** + * string trace = 1; + * @return The trace. + */ + java.lang.String getTrace(); + /** + * string trace = 1; + * @return The bytes for trace. + */ + com.google.protobuf.ByteString + getTraceBytes(); + + /** + * int64 cross_time_ms = 2; + * @return The crossTimeMs. + */ + long getCrossTimeMs(); + + /** + *
+   ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+   * 
+ * + * string server_note = 3; + * @return The serverNote. + */ + java.lang.String getServerNote(); + /** + *
+   ** 路径2:区服在跨服返回后再追加的说明,证明「经区服二次处理」。 
+   * 
+ * + * string server_note = 3; + * @return The bytes for serverNote. + */ + com.google.protobuf.ByteString + getServerNoteBytes(); +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/PbService.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/PbService.java new file mode 100644 index 0000000..48e969c --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/PbService.java @@ -0,0 +1,141 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/pb_service.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf enum {@code demo.cmd.PbService} + */ +public enum PbService + implements com.google.protobuf.ProtocolMessageEnum { + /** + * Default = 0; + */ + Default(0), + /** + * Service_1 = 1; + */ + Service_1(1), + /** + * Service_2 = 2; + */ + Service_2(2), + /** + * Service_3 = 3; + */ + Service_3(3), + /** + * Service_4 = 4; + */ + Service_4(4), + UNRECOGNIZED(-1), + ; + + /** + * Default = 0; + */ + public static final int Default_VALUE = 0; + /** + * Service_1 = 1; + */ + public static final int Service_1_VALUE = 1; + /** + * Service_2 = 2; + */ + public static final int Service_2_VALUE = 2; + /** + * Service_3 = 3; + */ + public static final int Service_3_VALUE = 3; + /** + * Service_4 = 4; + */ + public static final int Service_4_VALUE = 4; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static PbService valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static PbService forNumber(int value) { + switch (value) { + case 0: return Default; + case 1: return Service_1; + case 2: return Service_2; + case 3: return Service_3; + case 4: return Service_4; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + PbService> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public PbService findValueByNumber(int number) { + return PbService.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.huangzj.cmd.gen.PbServiceOuterClass.getDescriptor().getEnumTypes().get(0); + } + + private static final PbService[] VALUES = values(); + + public static PbService valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private PbService(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:demo.cmd.PbService) +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/PbServiceOuterClass.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/PbServiceOuterClass.java new file mode 100644 index 0000000..be50ebc --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/PbServiceOuterClass.java @@ -0,0 +1,39 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/pb_service.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +public final class PbServiceOuterClass { + private PbServiceOuterClass() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\034serverProto/pb_service.proto\022\010demo.cmd" + + "*T\n\tPbService\022\013\n\007Default\020\000\022\r\n\tService_1\020" + + "\001\022\r\n\tService_2\020\002\022\r\n\tService_3\020\003\022\r\n\tServi" + + "ce_4\020\004B\027\n\023com.huangzj.cmd.genP\001b\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service1_Method.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service1_Method.java new file mode 100644 index 0000000..b776ddb --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service1_Method.java @@ -0,0 +1,114 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf enum {@code demo.cmd.Service1_Method} + */ +public enum Service1_Method + implements com.google.protobuf.ProtocolMessageEnum { + /** + * Default1 = 0; + */ + Default1(0), + /** + * Method1 = 1; + */ + Method1(1), + UNRECOGNIZED(-1), + ; + + /** + * Default1 = 0; + */ + public static final int Default1_VALUE = 0; + /** + * Method1 = 1; + */ + public static final int Method1_VALUE = 1; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Service1_Method valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Service1_Method forNumber(int value) { + switch (value) { + case 0: return Default1; + case 1: return Method1; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Service1_Method> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Service1_Method findValueByNumber(int number) { + return Service1_Method.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.getDescriptor().getEnumTypes().get(0); + } + + private static final Service1_Method[] VALUES = values(); + + public static Service1_Method valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Service1_Method(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:demo.cmd.Service1_Method) +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service2_Method.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service2_Method.java new file mode 100644 index 0000000..d42d928 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service2_Method.java @@ -0,0 +1,114 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf enum {@code demo.cmd.Service2_Method} + */ +public enum Service2_Method + implements com.google.protobuf.ProtocolMessageEnum { + /** + * Default2 = 0; + */ + Default2(0), + /** + * Method2 = 1; + */ + Method2(1), + UNRECOGNIZED(-1), + ; + + /** + * Default2 = 0; + */ + public static final int Default2_VALUE = 0; + /** + * Method2 = 1; + */ + public static final int Method2_VALUE = 1; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Service2_Method valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Service2_Method forNumber(int value) { + switch (value) { + case 0: return Default2; + case 1: return Method2; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Service2_Method> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Service2_Method findValueByNumber(int number) { + return Service2_Method.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.getDescriptor().getEnumTypes().get(1); + } + + private static final Service2_Method[] VALUES = values(); + + public static Service2_Method valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Service2_Method(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:demo.cmd.Service2_Method) +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service3_Method.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service3_Method.java new file mode 100644 index 0000000..458dc76 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service3_Method.java @@ -0,0 +1,114 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + * Protobuf enum {@code demo.cmd.Service3_Method} + */ +public enum Service3_Method + implements com.google.protobuf.ProtocolMessageEnum { + /** + * Default3 = 0; + */ + Default3(0), + /** + * Method3 = 1; + */ + Method3(1), + UNRECOGNIZED(-1), + ; + + /** + * Default3 = 0; + */ + public static final int Default3_VALUE = 0; + /** + * Method3 = 1; + */ + public static final int Method3_VALUE = 1; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Service3_Method valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Service3_Method forNumber(int value) { + switch (value) { + case 0: return Default3; + case 1: return Method3; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Service3_Method> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Service3_Method findValueByNumber(int number) { + return Service3_Method.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.getDescriptor().getEnumTypes().get(2); + } + + private static final Service3_Method[] VALUES = values(); + + public static Service3_Method valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Service3_Method(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:demo.cmd.Service3_Method) +} + diff --git a/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service4_Method.java b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service4_Method.java new file mode 100644 index 0000000..d037ff5 --- /dev/null +++ b/ProtoBufModule/target/generated-sources/protobuf/java/com/huangzj/cmd/gen/Service4_Method.java @@ -0,0 +1,127 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: serverProto/cmd_rpc.proto + +// Protobuf Java Version: 3.25.3 +package com.huangzj.cmd.gen; + +/** + *
+ ** 区服 ↔ 跨服链路控制(注册、心跳),不经客户端 TCP。 
+ * 
+ * + * Protobuf enum {@code demo.cmd.Service4_Method} + */ +public enum Service4_Method + implements com.google.protobuf.ProtocolMessageEnum { + /** + * Default4 = 0; + */ + Default4(0), + /** + * Register = 1; + */ + Register(1), + /** + * Heartbeat = 2; + */ + Heartbeat(2), + UNRECOGNIZED(-1), + ; + + /** + * Default4 = 0; + */ + public static final int Default4_VALUE = 0; + /** + * Register = 1; + */ + public static final int Register_VALUE = 1; + /** + * Heartbeat = 2; + */ + public static final int Heartbeat_VALUE = 2; + + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static Service4_Method valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static Service4_Method forNumber(int value) { + switch (value) { + case 0: return Default4; + case 1: return Register; + case 2: return Heartbeat; + default: return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + private static final com.google.protobuf.Internal.EnumLiteMap< + Service4_Method> internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public Service4_Method findValueByNumber(int number) { + return Service4_Method.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor + getValueDescriptor() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(ordinal()); + } + public final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptorForType() { + return getDescriptor(); + } + public static final com.google.protobuf.Descriptors.EnumDescriptor + getDescriptor() { + return com.huangzj.cmd.gen.CmdRpc.getDescriptor().getEnumTypes().get(3); + } + + private static final Service4_Method[] VALUES = values(); + + public static Service4_Method valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException( + "EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private Service4_Method(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:demo.cmd.Service4_Method) +} + diff --git a/ProtoBufModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/ProtoBufModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..56f99bf --- /dev/null +++ b/ProtoBufModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,55 @@ +com\huangzj\cmd\gen\CrossProxyCtsOrBuilder.class +com\huangzj\cmd\gen\CmdEchoCts.class +com\huangzj\cmd\gen\CmdRpc.class +com\huangzj\cmd\gen\CrossProxyStcOrBuilder.class +com\huangzj\cmd\gen\CrossToGameStc$Builder.class +com\huangzj\cmd\gen\CrossToGameStc$1.class +com\huangzj\cmd\gen\CmdEchoStc$Builder.class +com\huangzj\comm\gen\EchoRequest.class +com\huangzj\cmd\gen\CmdEchoCts$1.class +com\huangzj\comm\gen\EchoResponse.class +com\huangzj\cross\gen\CrossPing.class +com\huangzj\cmd\gen\CmdEchoStc$1.class +com\huangzj\cmd\gen\CmdEchoCts$Builder.class +com\huangzj\cross\gen\CrossPong.class +com\huangzj\cmd\gen\CrossProxyStc.class +com\huangzj\comm\gen\EchoRequest$Builder.class +com\huangzj\comm\gen\EchoRequest$1.class +com\huangzj\cross\gen\CrossPongOrBuilder.class +com\huangzj\cmd\gen\CrossToGameCts$1.class +com\huangzj\cmd\gen\CrossToGameCts.class +com\huangzj\cmd\gen\CmdRpcEnvelope$1.class +com\huangzj\cmd\gen\CrossForwardCts$Builder.class +com\huangzj\comm\gen\EchoRequestOrBuilder.class +com\huangzj\cross\gen\CrossPong$1.class +com\huangzj\cmd\gen\CrossForwardStc.class +com\huangzj\cmd\gen\CrossProxyCts.class +com\huangzj\cmd\gen\CrossToGameStc.class +com\huangzj\cross\gen\CrossPingOrBuilder.class +com\huangzj\cmd\gen\CrossProxyCts$1.class +com\huangzj\cmd\gen\CrossToGameCtsOrBuilder.class +com\huangzj\cmd\gen\CrossProxyStc$1.class +com\huangzj\cmd\gen\CrossToGameStcOrBuilder.class +com\huangzj\comm\gen\EchoResponse$1.class +com\huangzj\cmd\gen\CmdRpcEnvelopeOrBuilder.class +com\huangzj\cross\gen\CrossPing$1.class +com\huangzj\cmd\gen\CmdRpcEnvelope$Builder.class +com\huangzj\comm\gen\EchoProto.class +com\huangzj\cmd\gen\CrossProxyCts$Builder.class +com\huangzj\cmd\gen\CmdEchoCtsOrBuilder.class +com\huangzj\cmd\gen\CmdEchoStcOrBuilder.class +com\huangzj\comm\gen\EchoResponse$Builder.class +com\huangzj\cmd\gen\CrossForwardStc$Builder.class +com\huangzj\cmd\gen\CrossForwardCts.class +com\huangzj\cmd\gen\CrossForwardStc$1.class +com\huangzj\cmd\gen\CrossForwardCts$1.class +com\huangzj\cmd\gen\CmdRpcEnvelope.class +com\huangzj\cmd\gen\CrossForwardCtsOrBuilder.class +com\huangzj\cmd\gen\CrossProxyStc$Builder.class +com\huangzj\cmd\gen\CrossForwardStcOrBuilder.class +com\huangzj\cmd\gen\CmdEchoStc.class +com\huangzj\cross\gen\CrossLink.class +com\huangzj\cmd\gen\CrossToGameCts$Builder.class +com\huangzj\comm\gen\EchoResponseOrBuilder.class +com\huangzj\cross\gen\CrossPing$Builder.class +com\huangzj\cross\gen\CrossPong$Builder.class diff --git a/ProtoBufModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/ProtoBufModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..2d86c2d --- /dev/null +++ b/ProtoBufModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,29 @@ +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossProxyStcOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\Service4_Method.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossLinkRegisterStc.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CmdRpcEnvelope.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossLinkRegisterCtsOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\Service2_Method.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\Service3_Method.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CmdEchoCtsOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossForwardCts.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossLinkRegisterCts.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossForwardStcOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossForwardStc.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CmdRpcEnvelopeOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\Service1_Method.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossLinkHeartbeatCtsOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossLinkHeartbeatStc.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\PbServiceOuterClass.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossLinkHeartbeatCts.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossForwardCtsOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossLinkRegisterStcOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CmdEchoStcOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossProxyStc.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CmdRpc.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CmdEchoStc.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\PbService.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CmdEchoCts.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossProxyCts.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossProxyCtsOrBuilder.java +F:\coding\comm-framework\ProtoBufModule\target\generated-sources\protobuf\java\com\huangzj\cmd\gen\CrossLinkHeartbeatStcOrBuilder.java diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/any.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/any.proto new file mode 100644 index 0000000..eff44e5 --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/any.proto @@ -0,0 +1,162 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option go_package = "google.golang.org/protobuf/types/known/anypb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "AnyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// `Any` contains an arbitrary serialized protocol buffer message along with a +// URL that describes the type of the serialized message. +// +// Protobuf library provides support to pack/unpack Any values in the form +// of utility functions or additional generated methods of the Any type. +// +// Example 1: Pack and unpack a message in C++. +// +// Foo foo = ...; +// Any any; +// any.PackFrom(foo); +// ... +// if (any.UnpackTo(&foo)) { +// ... +// } +// +// Example 2: Pack and unpack a message in Java. +// +// Foo foo = ...; +// Any any = Any.pack(foo); +// ... +// if (any.is(Foo.class)) { +// foo = any.unpack(Foo.class); +// } +// // or ... +// if (any.isSameTypeAs(Foo.getDefaultInstance())) { +// foo = any.unpack(Foo.getDefaultInstance()); +// } +// +// Example 3: Pack and unpack a message in Python. +// +// foo = Foo(...) +// any = Any() +// any.Pack(foo) +// ... +// if any.Is(Foo.DESCRIPTOR): +// any.Unpack(foo) +// ... +// +// Example 4: Pack and unpack a message in Go +// +// foo := &pb.Foo{...} +// any, err := anypb.New(foo) +// if err != nil { +// ... +// } +// ... +// foo := &pb.Foo{} +// if err := any.UnmarshalTo(foo); err != nil { +// ... +// } +// +// The pack methods provided by protobuf library will by default use +// 'type.googleapis.com/full.type.name' as the type URL and the unpack +// methods only use the fully qualified type name after the last '/' +// in the type URL, for example "foo.bar.com/x/y.z" will yield type +// name "y.z". +// +// JSON +// ==== +// The JSON representation of an `Any` value uses the regular +// representation of the deserialized, embedded message, with an +// additional field `@type` which contains the type URL. Example: +// +// package google.profile; +// message Person { +// string first_name = 1; +// string last_name = 2; +// } +// +// { +// "@type": "type.googleapis.com/google.profile.Person", +// "firstName": , +// "lastName": +// } +// +// If the embedded message type is well-known and has a custom JSON +// representation, that representation will be embedded adding a field +// `value` which holds the custom JSON in addition to the `@type` +// field. Example (for message [google.protobuf.Duration][]): +// +// { +// "@type": "type.googleapis.com/google.protobuf.Duration", +// "value": "1.212s" +// } +// +message Any { + // A URL/resource name that uniquely identifies the type of the serialized + // protocol buffer message. This string must contain at least + // one "/" character. The last segment of the URL's path must represent + // the fully qualified name of the type (as in + // `path/google.protobuf.Duration`). The name should be in a canonical form + // (e.g., leading "." is not accepted). + // + // In practice, teams usually precompile into the binary all types that they + // expect it to use in the context of Any. However, for URLs which use the + // scheme `http`, `https`, or no scheme, one can optionally set up a type + // server that maps type URLs to message definitions as follows: + // + // * If no scheme is provided, `https` is assumed. + // * An HTTP GET on the URL must yield a [google.protobuf.Type][] + // value in binary format, or produce an error. + // * Applications are allowed to cache lookup results based on the + // URL, or have them precompiled into a binary to avoid any + // lookup. Therefore, binary compatibility needs to be preserved + // on changes to types. (Use versioned type names to manage + // breaking changes.) + // + // Note: this functionality is not currently available in the official + // protobuf release, and it is not used for type URLs beginning with + // type.googleapis.com. As of May 2023, there are no widely used type server + // implementations and no plans to implement one. + // + // Schemes other than `http`, `https` (or the empty scheme) might be + // used with implementation specific semantics. + // + string type_url = 1; + + // Must be a valid serialized protocol buffer of the above specified type. + bytes value = 2; +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/api.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/api.proto new file mode 100644 index 0000000..4222351 --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/api.proto @@ -0,0 +1,207 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +import "google/protobuf/source_context.proto"; +import "google/protobuf/type.proto"; + +option java_package = "com.google.protobuf"; +option java_outer_classname = "ApiProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "google.golang.org/protobuf/types/known/apipb"; + +// Api is a light-weight descriptor for an API Interface. +// +// Interfaces are also described as "protocol buffer services" in some contexts, +// such as by the "service" keyword in a .proto file, but they are different +// from API Services, which represent a concrete implementation of an interface +// as opposed to simply a description of methods and bindings. They are also +// sometimes simply referred to as "APIs" in other contexts, such as the name of +// this message itself. See https://cloud.google.com/apis/design/glossary for +// detailed terminology. +message Api { + // The fully qualified name of this interface, including package name + // followed by the interface's simple name. + string name = 1; + + // The methods of this interface, in unspecified order. + repeated Method methods = 2; + + // Any metadata attached to the interface. + repeated Option options = 3; + + // A version string for this interface. If specified, must have the form + // `major-version.minor-version`, as in `1.10`. If the minor version is + // omitted, it defaults to zero. If the entire version field is empty, the + // major version is derived from the package name, as outlined below. If the + // field is not empty, the version in the package name will be verified to be + // consistent with what is provided here. + // + // The versioning schema uses [semantic + // versioning](http://semver.org) where the major version number + // indicates a breaking change and the minor version an additive, + // non-breaking change. Both version numbers are signals to users + // what to expect from different versions, and should be carefully + // chosen based on the product plan. + // + // The major version is also reflected in the package name of the + // interface, which must end in `v`, as in + // `google.feature.v1`. For major versions 0 and 1, the suffix can + // be omitted. Zero major versions must only be used for + // experimental, non-GA interfaces. + // + string version = 4; + + // Source context for the protocol buffer service represented by this + // message. + SourceContext source_context = 5; + + // Included interfaces. See [Mixin][]. + repeated Mixin mixins = 6; + + // The source syntax of the service. + Syntax syntax = 7; +} + +// Method represents a method of an API interface. +message Method { + // The simple name of this method. + string name = 1; + + // A URL of the input message type. + string request_type_url = 2; + + // If true, the request is streamed. + bool request_streaming = 3; + + // The URL of the output message type. + string response_type_url = 4; + + // If true, the response is streamed. + bool response_streaming = 5; + + // Any metadata attached to the method. + repeated Option options = 6; + + // The source syntax of this method. + Syntax syntax = 7; +} + +// Declares an API Interface to be included in this interface. The including +// interface must redeclare all the methods from the included interface, but +// documentation and options are inherited as follows: +// +// - If after comment and whitespace stripping, the documentation +// string of the redeclared method is empty, it will be inherited +// from the original method. +// +// - Each annotation belonging to the service config (http, +// visibility) which is not set in the redeclared method will be +// inherited. +// +// - If an http annotation is inherited, the path pattern will be +// modified as follows. Any version prefix will be replaced by the +// version of the including interface plus the [root][] path if +// specified. +// +// Example of a simple mixin: +// +// package google.acl.v1; +// service AccessControl { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v1/{resource=**}:getAcl"; +// } +// } +// +// package google.storage.v2; +// service Storage { +// rpc GetAcl(GetAclRequest) returns (Acl); +// +// // Get a data record. +// rpc GetData(GetDataRequest) returns (Data) { +// option (google.api.http).get = "/v2/{resource=**}"; +// } +// } +// +// Example of a mixin configuration: +// +// apis: +// - name: google.storage.v2.Storage +// mixins: +// - name: google.acl.v1.AccessControl +// +// The mixin construct implies that all methods in `AccessControl` are +// also declared with same name and request/response types in +// `Storage`. A documentation generator or annotation processor will +// see the effective `Storage.GetAcl` method after inherting +// documentation and annotations as follows: +// +// service Storage { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v2/{resource=**}:getAcl"; +// } +// ... +// } +// +// Note how the version in the path pattern changed from `v1` to `v2`. +// +// If the `root` field in the mixin is specified, it should be a +// relative path under which inherited HTTP paths are placed. Example: +// +// apis: +// - name: google.storage.v2.Storage +// mixins: +// - name: google.acl.v1.AccessControl +// root: acls +// +// This implies the following inherited HTTP annotation: +// +// service Storage { +// // Get the underlying ACL object. +// rpc GetAcl(GetAclRequest) returns (Acl) { +// option (google.api.http).get = "/v2/acls/{resource=**}:getAcl"; +// } +// ... +// } +message Mixin { + // The fully qualified name of the interface which is included. + string name = 1; + + // If non-empty specifies a path under which inherited HTTP paths + // are rooted. + string root = 2; +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/descriptor.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/descriptor.proto new file mode 100644 index 0000000..4748643 --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/descriptor.proto @@ -0,0 +1,1218 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + +syntax = "proto2"; + +package google.protobuf; + +option go_package = "google.golang.org/protobuf/types/descriptorpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; +option csharp_namespace = "Google.Protobuf.Reflection"; +option objc_class_prefix = "GPB"; +option cc_enable_arenas = true; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// The full set of known editions. +enum Edition { + // A placeholder for an unknown edition value. + EDITION_UNKNOWN = 0; + + // Legacy syntax "editions". These pre-date editions, but behave much like + // distinct editions. These can't be used to specify the edition of proto + // files, but feature definitions must supply proto2/proto3 defaults for + // backwards compatibility. + EDITION_PROTO2 = 998; + EDITION_PROTO3 = 999; + + // Editions that have been released. The specific values are arbitrary and + // should not be depended on, but they will always be time-ordered for easy + // comparison. + EDITION_2023 = 1000; + + // Placeholder editions for testing feature resolution. These should not be + // used or relyed on outside of tests. + EDITION_1_TEST_ONLY = 1; + EDITION_2_TEST_ONLY = 2; + EDITION_99997_TEST_ONLY = 99997; + EDITION_99998_TEST_ONLY = 99998; + EDITION_99999_TEST_ONLY = 99999; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + // Indexes of the public imported files in the dependency list above. + repeated int32 public_dependency = 10; + // Indexes of the weak imported files in the dependency list. + // For Google-internal migration only. Do not use. + repeated int32 weak_dependency = 11; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field without harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; + + // The syntax of the proto file. + // The supported values are "proto2", "proto3", and "editions". + // + // If `edition` is present, this value must be "editions". + optional string syntax = 12; + + // The edition of the proto file. + optional Edition edition = 14; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Exclusive. + + optional ExtensionRangeOptions options = 3; + } + repeated ExtensionRange extension_range = 5; + + repeated OneofDescriptorProto oneof_decl = 8; + + optional MessageOptions options = 7; + + // Range of reserved tag numbers. Reserved tag numbers may not be used by + // fields or extension ranges in the same message. Reserved ranges may + // not overlap. + message ReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Exclusive. + } + repeated ReservedRange reserved_range = 9; + // Reserved field names, which may not be used by fields in the same message. + // A given name may only be reserved once. + repeated string reserved_name = 10; +} + +message ExtensionRangeOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + message Declaration { + // The extension number declared within the extension range. + optional int32 number = 1; + + // The fully-qualified name of the extension field. There must be a leading + // dot in front of the full name. + optional string full_name = 2; + + // The fully-qualified type name of the extension field. Unlike + // Metadata.type, Declaration.type must have a leading dot for messages + // and enums. + optional string type = 3; + + // If true, indicates that the number is reserved in the extension range, + // and any extension field with the number will fail to compile. Set this + // when a declared extension field is deleted. + optional bool reserved = 5; + + // If true, indicates that the extension must be defined as repeated. + // Otherwise the extension must be defined as optional. + optional bool repeated = 6; + + reserved 4; // removed is_repeated + } + + // For external users: DO NOT USE. We are in the process of open sourcing + // extension declaration and executing internal cleanups before it can be + // used externally. + repeated Declaration declaration = 2 [retention = RETENTION_SOURCE]; + + // Any features defined in the specific edition. + optional FeatureSet features = 50; + + // The verification state of the extension range. + enum VerificationState { + // All the extensions of the range must be declared. + DECLARATION = 0; + UNVERIFIED = 1; + } + + // The verification state of the range. + // TODO: flip the default to DECLARATION once all empty ranges + // are marked as UNVERIFIED. + optional VerificationState verification = 3 [default = UNVERIFIED]; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + // negative values are likely. + TYPE_INT64 = 3; + TYPE_UINT64 = 4; + // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + // negative values are likely. + TYPE_INT32 = 5; + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + // Tag-delimited aggregate. + // Group type is deprecated and not supported after google.protobuf. However, Proto3 + // implementations should still be able to parse the group wire format and + // treat group fields as unknown fields. In Editions, the group wire format + // can be enabled via the `message_encoding` feature. + TYPE_GROUP = 10; + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + } + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REPEATED = 3; + // The required label is only allowed in google.protobuf. In proto3 and Editions + // it's explicitly prohibited. In Editions, the `field_presence` feature + // can be used to get this behavior. + LABEL_REQUIRED = 2; + } + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + optional string default_value = 7; + + // If set, gives the index of a oneof in the containing type's oneof_decl + // list. This field is a member of that oneof. + optional int32 oneof_index = 9; + + // JSON name of this field. The value is set by protocol compiler. If the + // user has set a "json_name" option on this field, that option's value + // will be used. Otherwise, it's deduced from the field's name by converting + // it to camelCase. + optional string json_name = 10; + + optional FieldOptions options = 8; + + // If true, this is a proto3 "optional". When a proto3 field is optional, it + // tracks presence regardless of field type. + // + // When proto3_optional is true, this field must be belong to a oneof to + // signal to old proto3 clients that presence is tracked for this field. This + // oneof is known as a "synthetic" oneof, and this field must be its sole + // member (each proto3 optional field gets its own synthetic oneof). Synthetic + // oneofs exist in the descriptor only, and do not generate any API. Synthetic + // oneofs must be ordered after all "real" oneofs. + // + // For message fields, proto3_optional doesn't create any semantic change, + // since non-repeated message fields always track presence. However it still + // indicates the semantic detail of whether the user wrote "optional" or not. + // This can be useful for round-tripping the .proto file. For consistency we + // give message fields a synthetic oneof also, even though it is not required + // to track presence. This is especially important because the parser can't + // tell if a field is a message or an enum, so it must always create a + // synthetic oneof. + // + // Proto2 optional fields do not set this flag, because they already indicate + // optional with `LABEL_OPTIONAL`. + optional bool proto3_optional = 17; +} + +// Describes a oneof. +message OneofDescriptorProto { + optional string name = 1; + optional OneofOptions options = 2; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; + + // Range of reserved numeric values. Reserved values may not be used by + // entries in the same enum. Reserved ranges may not overlap. + // + // Note that this is distinct from DescriptorProto.ReservedRange in that it + // is inclusive such that it can appropriately represent the entire int32 + // domain. + message EnumReservedRange { + optional int32 start = 1; // Inclusive. + optional int32 end = 2; // Inclusive. + } + + // Range of reserved numeric values. Reserved numeric values may not be used + // by enum values in the same enum declaration. Reserved ranges may not + // overlap. + repeated EnumReservedRange reserved_range = 4; + + // Reserved enum value names, which may not be reused. A given name may only + // be reserved once. + repeated string reserved_name = 5; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; + + // Identifies if client streams multiple client messages + optional bool client_streaming = 5 [default = false]; + // Identifies if server streams multiple server messages + optional bool server_streaming = 6 [default = false]; +} + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail protobuf-global-extension-registry@google.com +// to reserve extension numbers. Simply provide your project name (e.g. +// Objective-C plugin) and your project website (if available) -- there's no +// need to explain how you intend to use them. Usually you only need one +// extension number. You can declare multiple options with only one extension +// number by putting them in a sub-message. See the Custom Options section of +// the docs for examples: +// https://developers.google.com/protocol-buffers/docs/proto#options +// If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + // Controls the name of the wrapper Java class generated for the .proto file. + // That class will always contain the .proto file's getDescriptor() method as + // well as any top-level extensions defined in the .proto file. + // If java_multiple_files is disabled, then all the other classes from the + // .proto file will be nested inside the single wrapper outer class. + optional string java_outer_classname = 8; + + // If enabled, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the wrapper class + // named by java_outer_classname. However, the wrapper class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default = false]; + + // This option does nothing. + optional bool java_generate_equals_and_hash = 20 [deprecated=true]; + + // If set true, then the Java2 code generator will generate code that + // throws an exception whenever an attempt is made to assign a non-UTF-8 + // byte sequence to a string field. + // Message reflection will do the same. + // However, an extension field still accepts non-UTF-8 byte sequences. + // This option has no effect on when used with the lite runtime. + optional bool java_string_check_utf8 = 27 [default = false]; + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default = SPEED]; + + // Sets the Go package where structs generated from this .proto will be + // placed. If omitted, the Go package will be derived from the following: + // - The basename of the package import path, if provided. + // - Otherwise, the package statement in the .proto file, if present. + // - Otherwise, the basename of the .proto file, without extension. + optional string go_package = 11; + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of google.protobuf. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default = false]; + optional bool java_generic_services = 17 [default = false]; + optional bool py_generic_services = 18 [default = false]; + optional bool php_generic_services = 42 [default = false]; + + // Is this file deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for everything in the file, or it will be completely ignored; in the very + // least, this is a formalization for deprecating files. + optional bool deprecated = 23 [default = false]; + + // Enables the use of arenas for the proto messages in this file. This applies + // only to generated classes for C++. + optional bool cc_enable_arenas = 31 [default = true]; + + // Sets the objective c class prefix which is prepended to all objective c + // generated classes from this .proto. There is no default. + optional string objc_class_prefix = 36; + + // Namespace for generated classes; defaults to the package. + optional string csharp_namespace = 37; + + // By default Swift generators will take the proto package and CamelCase it + // replacing '.' with underscore and use that to prefix the types/symbols + // defined. When this options is provided, they will use this value instead + // to prefix the types/symbols defined. + optional string swift_prefix = 39; + + // Sets the php class prefix which is prepended to all php generated classes + // from this .proto. Default is empty. + optional string php_class_prefix = 40; + + // Use this option to change the namespace of php generated classes. Default + // is empty. When this option is empty, the package name will be used for + // determining the namespace. + optional string php_namespace = 41; + + // Use this option to change the namespace of php generated metadata classes. + // Default is empty. When this option is empty, the proto file name will be + // used for determining the namespace. + optional string php_metadata_namespace = 44; + + // Use this option to change the package of ruby generated classes. Default + // is empty. When this option is not set, the package name will be used for + // determining the ruby package. + optional string ruby_package = 45; + + // Any features defined in the specific edition. + optional FeatureSet features = 50; + + // The parser stores options it doesn't recognize here. + // See the documentation for the "Options" section above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. + // See the documentation for the "Options" section above. + extensions 1000 to max; + + reserved 38; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default = false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default = false]; + + // Is this message deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the message, or it will be completely ignored; in the very least, + // this is a formalization for deprecating messages. + optional bool deprecated = 3 [default = false]; + + reserved 4, 5, 6; + + // NOTE: Do not set the option in .proto files. Always use the maps syntax + // instead. The option should only be implicitly set by the proto compiler + // parser. + // + // Whether the message is an automatically generated map entry type for the + // maps field. + // + // For maps fields: + // map map_field = 1; + // The parsed descriptor looks like: + // message MapFieldEntry { + // option map_entry = true; + // optional KeyType key = 1; + // optional ValueType value = 2; + // } + // repeated MapFieldEntry map_field = 1; + // + // Implementations may choose not to generate the map_entry=true message, but + // use a native map in the target language to hold the keys and values. + // The reflection APIs in such implementations still need to work as + // if the field is a repeated message field. + optional bool map_entry = 7; + + reserved 8; // javalite_serializable + reserved 9; // javanano_as_lite + + // Enable the legacy handling of JSON field name conflicts. This lowercases + // and strips underscored from the fields before comparison in proto3 only. + // The new behavior takes `json_name` into account and applies to proto2 as + // well. + // + // This should only be used as a temporary measure against broken builds due + // to the change in behavior for JSON field name conflicts. + // + // TODO This is legacy behavior we plan to remove once downstream + // teams have had time to migrate. + optional bool deprecated_legacy_json_field_conflicts = 11 [deprecated = true]; + + // Any features defined in the specific edition. + optional FeatureSet features = 12; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is only implemented to support use of + // [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of + // type "bytes" in the open source release -- sorry, we'll try to include + // other types in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + // The option [ctype=CORD] may be applied to a non-repeated field of type + // "bytes". It indicates that in C++, the data should be stored in a Cord + // instead of a string. For very large strings, this may reduce memory + // fragmentation. It may also allow better performance when parsing from a + // Cord, or when parsing with aliasing enabled, as the parsed Cord may then + // alias the original buffer. + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. In proto3, only explicit setting it to + // false will avoid using packed encoding. This option is prohibited in + // Editions, but the `repeated_field_encoding` feature can be used to control + // the behavior. + optional bool packed = 2; + + // The jstype option determines the JavaScript type used for values of the + // field. The option is permitted only for 64 bit integral and fixed types + // (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + // is represented as JavaScript string, which avoids loss of precision that + // can happen when a large value is converted to a floating point JavaScript. + // Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + // use the JavaScript "number" type. The behavior of the default option + // JS_NORMAL is implementation dependent. + // + // This option is an enum to permit additional types to be added, e.g. + // goog.math.Integer. + optional JSType jstype = 6 [default = JS_NORMAL]; + enum JSType { + // Use the default type. + JS_NORMAL = 0; + + // Use JavaScript strings. + JS_STRING = 1; + + // Use JavaScript numbers. + JS_NUMBER = 2; + } + + // Should this field be parsed lazily? Lazy applies only to message-type + // fields. It means that when the outer message is initially parsed, the + // inner message's contents will not be parsed but instead stored in encoded + // form. The inner message will actually be parsed when it is first accessed. + // + // This is only a hint. Implementations are free to choose whether to use + // eager or lazy parsing regardless of the value of this option. However, + // setting this option true suggests that the protocol author believes that + // using lazy parsing on this field is worth the additional bookkeeping + // overhead typically needed to implement it. + // + // This option does not affect the public interface of any generated code; + // all method signatures remain the same. Furthermore, thread-safety of the + // interface is not affected by this option; const methods remain safe to + // call from multiple threads concurrently, while non-const methods continue + // to require exclusive access. + // + // Note that implementations may choose not to check required fields within + // a lazy sub-message. That is, calling IsInitialized() on the outer message + // may return true even if the inner message has missing required fields. + // This is necessary because otherwise the inner message would have to be + // parsed in order to perform the check, defeating the purpose of lazy + // parsing. An implementation which chooses not to check required fields + // must be consistent about it. That is, for any particular sub-message, the + // implementation must either *always* check its required fields, or *never* + // check its required fields, regardless of whether or not the message has + // been parsed. + // + // As of May 2022, lazy verifies the contents of the byte stream during + // parsing. An invalid byte stream will cause the overall parsing to fail. + optional bool lazy = 5 [default = false]; + + // unverified_lazy does no correctness checks on the byte stream. This should + // only be used where lazy with verification is prohibitive for performance + // reasons. + optional bool unverified_lazy = 15 [default = false]; + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default = false]; + + // For Google-internal migration only. Do not use. + optional bool weak = 10 [default = false]; + + // Indicate that the field value should not be printed out when using debug + // formats, e.g. when the field contains sensitive credentials. + optional bool debug_redact = 16 [default = false]; + + // If set to RETENTION_SOURCE, the option will be omitted from the binary. + // Note: as of January 2023, support for this is in progress and does not yet + // have an effect (b/264593489). + enum OptionRetention { + RETENTION_UNKNOWN = 0; + RETENTION_RUNTIME = 1; + RETENTION_SOURCE = 2; + } + + optional OptionRetention retention = 17; + + // This indicates the types of entities that the field may apply to when used + // as an option. If it is unset, then the field may be freely used as an + // option on any kind of entity. Note: as of January 2023, support for this is + // in progress and does not yet have an effect (b/264593489). + enum OptionTargetType { + TARGET_TYPE_UNKNOWN = 0; + TARGET_TYPE_FILE = 1; + TARGET_TYPE_EXTENSION_RANGE = 2; + TARGET_TYPE_MESSAGE = 3; + TARGET_TYPE_FIELD = 4; + TARGET_TYPE_ONEOF = 5; + TARGET_TYPE_ENUM = 6; + TARGET_TYPE_ENUM_ENTRY = 7; + TARGET_TYPE_SERVICE = 8; + TARGET_TYPE_METHOD = 9; + } + + repeated OptionTargetType targets = 19; + + message EditionDefault { + optional Edition edition = 3; + optional string value = 2; // Textproto value. + } + repeated EditionDefault edition_defaults = 20; + + // Any features defined in the specific edition. + optional FeatureSet features = 21; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; + + reserved 4; // removed jtype + reserved 18; // reserve target, target_obsolete_do_not_use +} + +message OneofOptions { + // Any features defined in the specific edition. + optional FeatureSet features = 1; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // Set this option to true to allow mapping different tag names to the same + // value. + optional bool allow_alias = 2; + + // Is this enum deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum, or it will be completely ignored; in the very least, this + // is a formalization for deprecating enums. + optional bool deprecated = 3 [default = false]; + + reserved 5; // javanano_as_lite + + // Enable the legacy handling of JSON field name conflicts. This lowercases + // and strips underscored from the fields before comparison in proto3 only. + // The new behavior takes `json_name` into account and applies to proto2 as + // well. + // TODO Remove this legacy behavior once downstream teams have + // had time to migrate. + optional bool deprecated_legacy_json_field_conflicts = 6 [deprecated = true]; + + // Any features defined in the specific edition. + optional FeatureSet features = 7; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // Is this enum value deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the enum value, or it will be completely ignored; in the very least, + // this is a formalization for deprecating enum values. + optional bool deprecated = 1 [default = false]; + + // Any features defined in the specific edition. + optional FeatureSet features = 2; + + // Indicate that fields annotated with this enum value should not be printed + // out when using debug formats, e.g. when the field contains sensitive + // credentials. + optional bool debug_redact = 3 [default = false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Any features defined in the specific edition. + optional FeatureSet features = 34; + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this service deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the service, or it will be completely ignored; in the very least, + // this is a formalization for deprecating services. + optional bool deprecated = 33 [default = false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // Is this method deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for the method, or it will be completely ignored; in the very least, + // this is a formalization for deprecating methods. + optional bool deprecated = 33 [default = false]; + + // Is this method side-effect-free (or safe in HTTP parlance), or idempotent, + // or neither? HTTP based RPC implementation may choose GET verb for safe + // methods, and PUT verb for idempotent methods instead of the default POST. + enum IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0; + NO_SIDE_EFFECTS = 1; // implies idempotent + IDEMPOTENT = 2; // idempotent, but may have side effects + } + optional IdempotencyLevel idempotency_level = 34 + [default = IDEMPOTENCY_UNKNOWN]; + + // Any features defined in the specific edition. + optional FeatureSet features = 35; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents + // "foo.(bar.baz).moo". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Features + +// TODO Enums in C++ gencode (and potentially other languages) are +// not well scoped. This means that each of the feature enums below can clash +// with each other. The short names we've chosen maximize call-site +// readability, but leave us very open to this scenario. A future feature will +// be designed and implemented to handle this, hopefully before we ever hit a +// conflict here. +message FeatureSet { + enum FieldPresence { + FIELD_PRESENCE_UNKNOWN = 0; + EXPLICIT = 1; + IMPLICIT = 2; + LEGACY_REQUIRED = 3; + } + optional FieldPresence field_presence = 1 [ + retention = RETENTION_RUNTIME, + targets = TARGET_TYPE_FIELD, + targets = TARGET_TYPE_FILE, + edition_defaults = { edition: EDITION_PROTO2, value: "EXPLICIT" }, + edition_defaults = { edition: EDITION_PROTO3, value: "IMPLICIT" }, + edition_defaults = { edition: EDITION_2023, value: "EXPLICIT" } + ]; + + enum EnumType { + ENUM_TYPE_UNKNOWN = 0; + OPEN = 1; + CLOSED = 2; + } + optional EnumType enum_type = 2 [ + retention = RETENTION_RUNTIME, + targets = TARGET_TYPE_ENUM, + targets = TARGET_TYPE_FILE, + edition_defaults = { edition: EDITION_PROTO2, value: "CLOSED" }, + edition_defaults = { edition: EDITION_PROTO3, value: "OPEN" } + ]; + + enum RepeatedFieldEncoding { + REPEATED_FIELD_ENCODING_UNKNOWN = 0; + PACKED = 1; + EXPANDED = 2; + } + optional RepeatedFieldEncoding repeated_field_encoding = 3 [ + retention = RETENTION_RUNTIME, + targets = TARGET_TYPE_FIELD, + targets = TARGET_TYPE_FILE, + edition_defaults = { edition: EDITION_PROTO2, value: "EXPANDED" }, + edition_defaults = { edition: EDITION_PROTO3, value: "PACKED" } + ]; + + enum Utf8Validation { + UTF8_VALIDATION_UNKNOWN = 0; + NONE = 1; + VERIFY = 2; + } + optional Utf8Validation utf8_validation = 4 [ + retention = RETENTION_RUNTIME, + targets = TARGET_TYPE_FIELD, + targets = TARGET_TYPE_FILE, + edition_defaults = { edition: EDITION_PROTO2, value: "NONE" }, + edition_defaults = { edition: EDITION_PROTO3, value: "VERIFY" } + ]; + + enum MessageEncoding { + MESSAGE_ENCODING_UNKNOWN = 0; + LENGTH_PREFIXED = 1; + DELIMITED = 2; + } + optional MessageEncoding message_encoding = 5 [ + retention = RETENTION_RUNTIME, + targets = TARGET_TYPE_FIELD, + targets = TARGET_TYPE_FILE, + edition_defaults = { edition: EDITION_PROTO2, value: "LENGTH_PREFIXED" } + ]; + + enum JsonFormat { + JSON_FORMAT_UNKNOWN = 0; + ALLOW = 1; + LEGACY_BEST_EFFORT = 2; + } + optional JsonFormat json_format = 6 [ + retention = RETENTION_RUNTIME, + targets = TARGET_TYPE_MESSAGE, + targets = TARGET_TYPE_ENUM, + targets = TARGET_TYPE_FILE, + edition_defaults = { edition: EDITION_PROTO2, value: "LEGACY_BEST_EFFORT" }, + edition_defaults = { edition: EDITION_PROTO3, value: "ALLOW" } + ]; + + reserved 999; + + extensions 1000; // for Protobuf C++ + extensions 1001; // for Protobuf Java + + extensions 9995 to 9999; // For internal testing +} + +// A compiled specification for the defaults of a set of features. These +// messages are generated from FeatureSet extensions and can be used to seed +// feature resolution. The resolution with this object becomes a simple search +// for the closest matching edition, followed by proto merges. +message FeatureSetDefaults { + // A map from every known edition with a unique set of defaults to its + // defaults. Not all editions may be contained here. For a given edition, + // the defaults at the closest matching edition ordered at or before it should + // be used. This field must be in strict ascending order by edition. + message FeatureSetEditionDefault { + optional Edition edition = 3; + optional FeatureSet features = 2; + } + repeated FeatureSetEditionDefault defaults = 1; + + // The minimum supported edition (inclusive) when this was constructed. + // Editions before this will not have defaults. + optional Edition minimum_edition = 4; + + // The maximum known edition (inclusive) when this was constructed. Editions + // after this will not have reliable defaults. + optional Edition maximum_edition = 5; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendant. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition occurs. + // For example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed = true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed = true]; + + // If this SourceCodeInfo represents a complete declaration, these are any + // comments appearing before and after the declaration which appear to be + // attached to the declaration. + // + // A series of line comments appearing on consecutive lines, with no other + // tokens appearing on those lines, will be treated as a single comment. + // + // leading_detached_comments will keep paragraphs of comments that appear + // before (but not connected to) the current element. Each paragraph, + // separated by empty lines, will be one comment element in the repeated + // field. + // + // Only the comment content is provided; comment markers (e.g. //) are + // stripped out. For block comments, leading whitespace and an asterisk + // will be stripped from the beginning of each line other than the first. + // Newlines are included in the output. + // + // Examples: + // + // optional int32 foo = 1; // Comment attached to foo. + // // Comment attached to bar. + // optional int32 bar = 2; + // + // optional string baz = 3; + // // Comment attached to baz. + // // Another line attached to baz. + // + // // Comment attached to moo. + // // + // // Another line attached to moo. + // optional double moo = 4; + // + // // Detached comment for corge. This is not leading or trailing comments + // // to moo or corge because there are blank lines separating it from + // // both. + // + // // Detached comment for corge paragraph 2. + // + // optional string corge = 5; + // /* Block comment attached + // * to corge. Leading asterisks + // * will be removed. */ + // /* Block comment attached to + // * grault. */ + // optional int32 grault = 6; + // + // // ignored detached comments. + optional string leading_comments = 3; + optional string trailing_comments = 4; + repeated string leading_detached_comments = 6; + } +} + +// Describes the relationship between generated code and its original source +// file. A GeneratedCodeInfo message is associated with only one generated +// source file, but may contain references to different source .proto files. +message GeneratedCodeInfo { + // An Annotation connects some span of text in generated code to an element + // of its generating .proto file. + repeated Annotation annotation = 1; + message Annotation { + // Identifies the element in the original source .proto file. This field + // is formatted the same as SourceCodeInfo.Location.path. + repeated int32 path = 1 [packed = true]; + + // Identifies the filesystem path to the original source .proto. + optional string source_file = 2; + + // Identifies the starting offset in bytes in the generated code + // that relates to the identified object. + optional int32 begin = 3; + + // Identifies the ending offset in bytes in the generated code that + // relates to the identified object. The end offset should be one past + // the last relevant byte (so the length of the text = end - begin). + optional int32 end = 4; + + // Represents the identified object's effect on the element in the original + // .proto file. + enum Semantic { + // There is no effect or the effect is indescribable. + NONE = 0; + // The element is set or otherwise mutated. + SET = 1; + // An alias to the element is returned. + ALIAS = 2; + } + optional Semantic semantic = 5; + } +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/duration.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/duration.proto new file mode 100644 index 0000000..41f40c2 --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/duration.proto @@ -0,0 +1,115 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/durationpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DurationProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// A Duration represents a signed, fixed-length span of time represented +// as a count of seconds and fractions of seconds at nanosecond +// resolution. It is independent of any calendar and concepts like "day" +// or "month". It is related to Timestamp in that the difference between +// two Timestamp values is a Duration and it can be added or subtracted +// from a Timestamp. Range is approximately +-10,000 years. +// +// # Examples +// +// Example 1: Compute Duration from two Timestamps in pseudo code. +// +// Timestamp start = ...; +// Timestamp end = ...; +// Duration duration = ...; +// +// duration.seconds = end.seconds - start.seconds; +// duration.nanos = end.nanos - start.nanos; +// +// if (duration.seconds < 0 && duration.nanos > 0) { +// duration.seconds += 1; +// duration.nanos -= 1000000000; +// } else if (duration.seconds > 0 && duration.nanos < 0) { +// duration.seconds -= 1; +// duration.nanos += 1000000000; +// } +// +// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. +// +// Timestamp start = ...; +// Duration duration = ...; +// Timestamp end = ...; +// +// end.seconds = start.seconds + duration.seconds; +// end.nanos = start.nanos + duration.nanos; +// +// if (end.nanos < 0) { +// end.seconds -= 1; +// end.nanos += 1000000000; +// } else if (end.nanos >= 1000000000) { +// end.seconds += 1; +// end.nanos -= 1000000000; +// } +// +// Example 3: Compute Duration from datetime.timedelta in Python. +// +// td = datetime.timedelta(days=3, minutes=10) +// duration = Duration() +// duration.FromTimedelta(td) +// +// # JSON Mapping +// +// In JSON format, the Duration type is encoded as a string rather than an +// object, where the string ends in the suffix "s" (indicating seconds) and +// is preceded by the number of seconds, with nanoseconds expressed as +// fractional seconds. For example, 3 seconds with 0 nanoseconds should be +// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should +// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 +// microsecond should be expressed in JSON format as "3.000001s". +// +message Duration { + // Signed seconds of the span of time. Must be from -315,576,000,000 + // to +315,576,000,000 inclusive. Note: these bounds are computed from: + // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + int64 seconds = 1; + + // Signed fractions of a second at nanosecond resolution of the span + // of time. Durations less than one second are represented with a 0 + // `seconds` field and a positive or negative `nanos` field. For durations + // of one second or more, a non-zero value for the `nanos` field must be + // of the same sign as the `seconds` field. Must be from -999,999,999 + // to +999,999,999 inclusive. + int32 nanos = 2; +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/empty.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/empty.proto new file mode 100644 index 0000000..b87c89d --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/empty.proto @@ -0,0 +1,51 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option go_package = "google.golang.org/protobuf/types/known/emptypb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "EmptyProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option cc_enable_arenas = true; + +// A generic empty message that you can re-use to avoid defining duplicated +// empty messages in your APIs. A typical example is to use it as the request +// or the response type of an API method. For instance: +// +// service Foo { +// rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); +// } +// +message Empty {} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/field_mask.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/field_mask.proto new file mode 100644 index 0000000..b28334b --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/field_mask.proto @@ -0,0 +1,245 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option java_package = "com.google.protobuf"; +option java_outer_classname = "FieldMaskProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "google.golang.org/protobuf/types/known/fieldmaskpb"; +option cc_enable_arenas = true; + +// `FieldMask` represents a set of symbolic field paths, for example: +// +// paths: "f.a" +// paths: "f.b.d" +// +// Here `f` represents a field in some root message, `a` and `b` +// fields in the message found in `f`, and `d` a field found in the +// message in `f.b`. +// +// Field masks are used to specify a subset of fields that should be +// returned by a get operation or modified by an update operation. +// Field masks also have a custom JSON encoding (see below). +// +// # Field Masks in Projections +// +// When used in the context of a projection, a response message or +// sub-message is filtered by the API to only contain those fields as +// specified in the mask. For example, if the mask in the previous +// example is applied to a response message as follows: +// +// f { +// a : 22 +// b { +// d : 1 +// x : 2 +// } +// y : 13 +// } +// z: 8 +// +// The result will not contain specific values for fields x,y and z +// (their value will be set to the default, and omitted in proto text +// output): +// +// +// f { +// a : 22 +// b { +// d : 1 +// } +// } +// +// A repeated field is not allowed except at the last position of a +// paths string. +// +// If a FieldMask object is not present in a get operation, the +// operation applies to all fields (as if a FieldMask of all fields +// had been specified). +// +// Note that a field mask does not necessarily apply to the +// top-level response message. In case of a REST get operation, the +// field mask applies directly to the response, but in case of a REST +// list operation, the mask instead applies to each individual message +// in the returned resource list. In case of a REST custom method, +// other definitions may be used. Where the mask applies will be +// clearly documented together with its declaration in the API. In +// any case, the effect on the returned resource/resources is required +// behavior for APIs. +// +// # Field Masks in Update Operations +// +// A field mask in update operations specifies which fields of the +// targeted resource are going to be updated. The API is required +// to only change the values of the fields as specified in the mask +// and leave the others untouched. If a resource is passed in to +// describe the updated values, the API ignores the values of all +// fields not covered by the mask. +// +// If a repeated field is specified for an update operation, new values will +// be appended to the existing repeated field in the target resource. Note that +// a repeated field is only allowed in the last position of a `paths` string. +// +// If a sub-message is specified in the last position of the field mask for an +// update operation, then new value will be merged into the existing sub-message +// in the target resource. +// +// For example, given the target message: +// +// f { +// b { +// d: 1 +// x: 2 +// } +// c: [1] +// } +// +// And an update message: +// +// f { +// b { +// d: 10 +// } +// c: [2] +// } +// +// then if the field mask is: +// +// paths: ["f.b", "f.c"] +// +// then the result will be: +// +// f { +// b { +// d: 10 +// x: 2 +// } +// c: [1, 2] +// } +// +// An implementation may provide options to override this default behavior for +// repeated and message fields. +// +// In order to reset a field's value to the default, the field must +// be in the mask and set to the default value in the provided resource. +// Hence, in order to reset all fields of a resource, provide a default +// instance of the resource and set all fields in the mask, or do +// not provide a mask as described below. +// +// If a field mask is not present on update, the operation applies to +// all fields (as if a field mask of all fields has been specified). +// Note that in the presence of schema evolution, this may mean that +// fields the client does not know and has therefore not filled into +// the request will be reset to their default. If this is unwanted +// behavior, a specific service may require a client to always specify +// a field mask, producing an error if not. +// +// As with get operations, the location of the resource which +// describes the updated values in the request message depends on the +// operation kind. In any case, the effect of the field mask is +// required to be honored by the API. +// +// ## Considerations for HTTP REST +// +// The HTTP kind of an update operation which uses a field mask must +// be set to PATCH instead of PUT in order to satisfy HTTP semantics +// (PUT must only be used for full updates). +// +// # JSON Encoding of Field Masks +// +// In JSON, a field mask is encoded as a single string where paths are +// separated by a comma. Fields name in each path are converted +// to/from lower-camel naming conventions. +// +// As an example, consider the following message declarations: +// +// message Profile { +// User user = 1; +// Photo photo = 2; +// } +// message User { +// string display_name = 1; +// string address = 2; +// } +// +// In proto a field mask for `Profile` may look as such: +// +// mask { +// paths: "user.display_name" +// paths: "photo" +// } +// +// In JSON, the same mask is represented as below: +// +// { +// mask: "user.displayName,photo" +// } +// +// # Field Masks and Oneof Fields +// +// Field masks treat fields in oneofs just as regular fields. Consider the +// following message: +// +// message SampleMessage { +// oneof test_oneof { +// string name = 4; +// SubMessage sub_message = 9; +// } +// } +// +// The field mask can be: +// +// mask { +// paths: "name" +// } +// +// Or: +// +// mask { +// paths: "sub_message" +// } +// +// Note that oneof type names ("test_oneof" in this case) cannot be used in +// paths. +// +// ## Field Mask Verification +// +// The implementation of any API method which has a FieldMask type field in the +// request should verify the included field paths, and return an +// `INVALID_ARGUMENT` error if any path is unmappable. +message FieldMask { + // The set of field mask paths. + repeated string paths = 1; +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/source_context.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/source_context.proto new file mode 100644 index 0000000..135f50f --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/source_context.proto @@ -0,0 +1,48 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option java_package = "com.google.protobuf"; +option java_outer_classname = "SourceContextProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "google.golang.org/protobuf/types/known/sourcecontextpb"; + +// `SourceContext` represents information about the source of a +// protobuf element, like the file in which it is defined. +message SourceContext { + // The path-qualified name of the .proto file that contained the associated + // protobuf element. For example: `"google/protobuf/source_context.proto"`. + string file_name = 1; +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/struct.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/struct.proto new file mode 100644 index 0000000..1bf0c1a --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/struct.proto @@ -0,0 +1,95 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/structpb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "StructProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// `Struct` represents a structured data value, consisting of fields +// which map to dynamically typed values. In some languages, `Struct` +// might be supported by a native representation. For example, in +// scripting languages like JS a struct is represented as an +// object. The details of that representation are described together +// with the proto support for the language. +// +// The JSON representation for `Struct` is JSON object. +message Struct { + // Unordered map of dynamically typed values. + map fields = 1; +} + +// `Value` represents a dynamically typed value which can be either +// null, a number, a string, a boolean, a recursive struct value, or a +// list of values. A producer of value is expected to set one of these +// variants. Absence of any variant indicates an error. +// +// The JSON representation for `Value` is JSON value. +message Value { + // The kind of value. + oneof kind { + // Represents a null value. + NullValue null_value = 1; + // Represents a double value. + double number_value = 2; + // Represents a string value. + string string_value = 3; + // Represents a boolean value. + bool bool_value = 4; + // Represents a structured value. + Struct struct_value = 5; + // Represents a repeated `Value`. + ListValue list_value = 6; + } +} + +// `NullValue` is a singleton enumeration to represent the null value for the +// `Value` type union. +// +// The JSON representation for `NullValue` is JSON `null`. +enum NullValue { + // Null value. + NULL_VALUE = 0; +} + +// `ListValue` is a wrapper around a repeated field of values. +// +// The JSON representation for `ListValue` is JSON array. +message ListValue { + // Repeated field of dynamically typed values. + repeated Value values = 1; +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/timestamp.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/timestamp.proto new file mode 100644 index 0000000..fd0bc07 --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/timestamp.proto @@ -0,0 +1,144 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/timestamppb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "TimestampProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// A Timestamp represents a point in time independent of any time zone or local +// calendar, encoded as a count of seconds and fractions of seconds at +// nanosecond resolution. The count is relative to an epoch at UTC midnight on +// January 1, 1970, in the proleptic Gregorian calendar which extends the +// Gregorian calendar backwards to year one. +// +// All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap +// second table is needed for interpretation, using a [24-hour linear +// smear](https://developers.google.com/time/smear). +// +// The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By +// restricting to that range, we ensure that we can convert to and from [RFC +// 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. +// +// # Examples +// +// Example 1: Compute Timestamp from POSIX `time()`. +// +// Timestamp timestamp; +// timestamp.set_seconds(time(NULL)); +// timestamp.set_nanos(0); +// +// Example 2: Compute Timestamp from POSIX `gettimeofday()`. +// +// struct timeval tv; +// gettimeofday(&tv, NULL); +// +// Timestamp timestamp; +// timestamp.set_seconds(tv.tv_sec); +// timestamp.set_nanos(tv.tv_usec * 1000); +// +// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. +// +// FILETIME ft; +// GetSystemTimeAsFileTime(&ft); +// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; +// +// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z +// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. +// Timestamp timestamp; +// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); +// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); +// +// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. +// +// long millis = System.currentTimeMillis(); +// +// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) +// .setNanos((int) ((millis % 1000) * 1000000)).build(); +// +// Example 5: Compute Timestamp from Java `Instant.now()`. +// +// Instant now = Instant.now(); +// +// Timestamp timestamp = +// Timestamp.newBuilder().setSeconds(now.getEpochSecond()) +// .setNanos(now.getNano()).build(); +// +// Example 6: Compute Timestamp from current time in Python. +// +// timestamp = Timestamp() +// timestamp.GetCurrentTime() +// +// # JSON Mapping +// +// In JSON format, the Timestamp type is encoded as a string in the +// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the +// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" +// where {year} is always expressed using four digits while {month}, {day}, +// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional +// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), +// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone +// is required. A proto3 JSON serializer should always use UTC (as indicated by +// "Z") when printing the Timestamp type and a proto3 JSON parser should be +// able to accept both UTC and other timezones (as indicated by an offset). +// +// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past +// 01:30 UTC on January 15, 2017. +// +// In JavaScript, one can convert a Date object to this format using the +// standard +// [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) +// method. In Python, a standard `datetime.datetime` object can be converted +// to this format using +// [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with +// the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use +// the Joda Time's [`ISODateTimeFormat.dateTime()`]( +// http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() +// ) to obtain a formatter capable of generating timestamps in this format. +// +message Timestamp { + // Represents seconds of UTC time since Unix epoch + // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + // 9999-12-31T23:59:59Z inclusive. + int64 seconds = 1; + + // Non-negative fractions of a second at nanosecond resolution. Negative + // second values with fractions must still have non-negative nanos values + // that count forward in time. Must be from 0 to 999,999,999 + // inclusive. + int32 nanos = 2; +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/type.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/type.proto new file mode 100644 index 0000000..48cb11e --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/type.proto @@ -0,0 +1,193 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package google.protobuf; + +import "google/protobuf/any.proto"; +import "google/protobuf/source_context.proto"; + +option cc_enable_arenas = true; +option java_package = "com.google.protobuf"; +option java_outer_classname = "TypeProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; +option go_package = "google.golang.org/protobuf/types/known/typepb"; + +// A protocol buffer message type. +message Type { + // The fully qualified message name. + string name = 1; + // The list of fields. + repeated Field fields = 2; + // The list of types appearing in `oneof` definitions in this type. + repeated string oneofs = 3; + // The protocol buffer options. + repeated Option options = 4; + // The source context. + SourceContext source_context = 5; + // The source syntax. + Syntax syntax = 6; + // The source edition string, only valid when syntax is SYNTAX_EDITIONS. + string edition = 7; +} + +// A single field of a message type. +message Field { + // Basic field types. + enum Kind { + // Field type unknown. + TYPE_UNKNOWN = 0; + // Field type double. + TYPE_DOUBLE = 1; + // Field type float. + TYPE_FLOAT = 2; + // Field type int64. + TYPE_INT64 = 3; + // Field type uint64. + TYPE_UINT64 = 4; + // Field type int32. + TYPE_INT32 = 5; + // Field type fixed64. + TYPE_FIXED64 = 6; + // Field type fixed32. + TYPE_FIXED32 = 7; + // Field type bool. + TYPE_BOOL = 8; + // Field type string. + TYPE_STRING = 9; + // Field type group. Proto2 syntax only, and deprecated. + TYPE_GROUP = 10; + // Field type message. + TYPE_MESSAGE = 11; + // Field type bytes. + TYPE_BYTES = 12; + // Field type uint32. + TYPE_UINT32 = 13; + // Field type enum. + TYPE_ENUM = 14; + // Field type sfixed32. + TYPE_SFIXED32 = 15; + // Field type sfixed64. + TYPE_SFIXED64 = 16; + // Field type sint32. + TYPE_SINT32 = 17; + // Field type sint64. + TYPE_SINT64 = 18; + } + + // Whether a field is optional, required, or repeated. + enum Cardinality { + // For fields with unknown cardinality. + CARDINALITY_UNKNOWN = 0; + // For optional fields. + CARDINALITY_OPTIONAL = 1; + // For required fields. Proto2 syntax only. + CARDINALITY_REQUIRED = 2; + // For repeated fields. + CARDINALITY_REPEATED = 3; + } + + // The field type. + Kind kind = 1; + // The field cardinality. + Cardinality cardinality = 2; + // The field number. + int32 number = 3; + // The field name. + string name = 4; + // The field type URL, without the scheme, for message or enumeration + // types. Example: `"type.googleapis.com/google.protobuf.Timestamp"`. + string type_url = 6; + // The index of the field type in `Type.oneofs`, for message or enumeration + // types. The first type has index 1; zero means the type is not in the list. + int32 oneof_index = 7; + // Whether to use alternative packed wire representation. + bool packed = 8; + // The protocol buffer options. + repeated Option options = 9; + // The field JSON name. + string json_name = 10; + // The string value of the default value of this field. Proto2 syntax only. + string default_value = 11; +} + +// Enum type definition. +message Enum { + // Enum type name. + string name = 1; + // Enum value definitions. + repeated EnumValue enumvalue = 2; + // Protocol buffer options. + repeated Option options = 3; + // The source context. + SourceContext source_context = 4; + // The source syntax. + Syntax syntax = 5; + // The source edition string, only valid when syntax is SYNTAX_EDITIONS. + string edition = 6; +} + +// Enum value definition. +message EnumValue { + // Enum value name. + string name = 1; + // Enum value number. + int32 number = 2; + // Protocol buffer options. + repeated Option options = 3; +} + +// A protocol buffer option, which can be attached to a message, field, +// enumeration, etc. +message Option { + // The option's name. For protobuf built-in options (options defined in + // descriptor.proto), this is the short name. For example, `"map_entry"`. + // For custom options, it should be the fully-qualified name. For example, + // `"google.api.http"`. + string name = 1; + // The option's value packed in an Any message. If the value is a primitive, + // the corresponding wrapper type defined in google/protobuf/wrappers.proto + // should be used. If the value is an enum, it should be stored as an int32 + // value using the google.protobuf.Int32Value type. + Any value = 2; +} + +// The syntax in which a protocol buffer element is defined. +enum Syntax { + // Syntax `proto2`. + SYNTAX_PROTO2 = 0; + // Syntax `proto3`. + SYNTAX_PROTO3 = 1; + // Syntax `editions`. + SYNTAX_EDITIONS = 2; +} diff --git a/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/wrappers.proto b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/wrappers.proto new file mode 100644 index 0000000..1959fa5 --- /dev/null +++ b/ProtoBufModule/target/protoc-dependencies/019e7612450e4ea202a8e34b6be3f337/google/protobuf/wrappers.proto @@ -0,0 +1,123 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// https://developers.google.com/protocol-buffers/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Wrappers for primitive (non-message) types. These types are useful +// for embedding primitives in the `google.protobuf.Any` type and for places +// where we need to distinguish between the absence of a primitive +// typed field and its default value. +// +// These wrappers have no meaningful use within repeated fields as they lack +// the ability to detect presence on individual elements. +// These wrappers have no meaningful use within a map or a oneof since +// individual entries of a map or fields of a oneof can already detect presence. + +syntax = "proto3"; + +package google.protobuf; + +option cc_enable_arenas = true; +option go_package = "google.golang.org/protobuf/types/known/wrapperspb"; +option java_package = "com.google.protobuf"; +option java_outer_classname = "WrappersProto"; +option java_multiple_files = true; +option objc_class_prefix = "GPB"; +option csharp_namespace = "Google.Protobuf.WellKnownTypes"; + +// Wrapper message for `double`. +// +// The JSON representation for `DoubleValue` is JSON number. +message DoubleValue { + // The double value. + double value = 1; +} + +// Wrapper message for `float`. +// +// The JSON representation for `FloatValue` is JSON number. +message FloatValue { + // The float value. + float value = 1; +} + +// Wrapper message for `int64`. +// +// The JSON representation for `Int64Value` is JSON string. +message Int64Value { + // The int64 value. + int64 value = 1; +} + +// Wrapper message for `uint64`. +// +// The JSON representation for `UInt64Value` is JSON string. +message UInt64Value { + // The uint64 value. + uint64 value = 1; +} + +// Wrapper message for `int32`. +// +// The JSON representation for `Int32Value` is JSON number. +message Int32Value { + // The int32 value. + int32 value = 1; +} + +// Wrapper message for `uint32`. +// +// The JSON representation for `UInt32Value` is JSON number. +message UInt32Value { + // The uint32 value. + uint32 value = 1; +} + +// Wrapper message for `bool`. +// +// The JSON representation for `BoolValue` is JSON `true` and `false`. +message BoolValue { + // The bool value. + bool value = 1; +} + +// Wrapper message for `string`. +// +// The JSON representation for `StringValue` is JSON string. +message StringValue { + // The string value. + string value = 1; +} + +// Wrapper message for `bytes`. +// +// The JSON representation for `BytesValue` is JSON string. +message BytesValue { + // The bytes value. + bytes value = 1; +} diff --git a/ProtoBufModule/target/protoc-plugins/protoc-3.25.3-windows-x86_64.exe b/ProtoBufModule/target/protoc-plugins/protoc-3.25.3-windows-x86_64.exe new file mode 100644 index 0000000..add9eeb Binary files /dev/null and b/ProtoBufModule/target/protoc-plugins/protoc-3.25.3-windows-x86_64.exe differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..b8b54c4 --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# comm-framework + +多模块示例工程:演示 **区服(游戏逻辑 + HTTP)**、**跨服(独立 TCP 进程)** 以及二者之间的 **长连接、注册、心跳** 与 **CmdRpc 业务帧** 的编解码与路由。 + +## 模块一览 + +| 模块 | 说明 | 文档 | +|------|------|------| +| **ProtoBufModule** | `.proto` 定义与 Java 生成(`CmdRpcEnvelope`、各业务消息、枚举) | [ProtoBufModule/README.md](ProtoBufModule/README.md) | +| **BaseModule** | 公共 Netty 帧、命令分发、`ProtoRegistry`、`CrossRpcInvoker` 抽象等 | [BaseModule/README.md](BaseModule/README.md) | +| **CrossModule** | 可独立启动的跨服进程:监听 TCP,处理 `CROSS_TCP` 来源命令 | [CrossModule/README.md](CrossModule/README.md) | +| **ServerModule** | 区服:客户端游戏 TCP、连跨服的 `CrossTcpClient`、HTTP Demo | [ServerModule/README.md](ServerModule/README.md) | + +## 总体架构(进程与端口) + +```mermaid +flowchart LR + subgraph Client["游戏客户端 / 本机探针"] + C[TCP 客户端] + end + subgraph Server["ServerModule 进程"] + CT[Client TCP :9091] + HTTP[HTTP :8080] + CC[CrossTcpClient 长连接] + end + subgraph Cross["CrossModule 进程"] + XT[Cross TCP :9200] + end + C -->|长度前缀 + CmdRpcEnvelope| CT + BROWSER[浏览器] -->|HTTP 探活/Demo| HTTP + CC -->|长度前缀 + CmdRpcEnvelope| XT +``` + +- **默认端口**(见各模块 `application.yml`):区服客户端 TCP 由 `game.client-tcp.port` 指定(示例 **9091**);跨服 TCP **9200**;区服 HTTP **8080**。 +- **区服 → 跨服** 使用 **单条 TCP 长连接**:启动后 **Service_4 注册**,定时 **Service_4 心跳**;业务请求通过 **`link_seq`** 在同一连接上多路复用。 + +## 统一帧格式(TCP) + +任意一条 TCP 消息在链路上的形态均为: + +```text ++------------------+------------------------+ +| 4 字节大端 length | length 字节的 body | ++------------------+------------------------+ + body = CmdRpcEnvelope.parseFrom(bytes) +``` + +实现见 `BaseModule` 中 `LengthPrefixedProtobuf`、`CmdRpcTcpFrameHandler`。 + +## 命令来源(CommandSource) + +| 来源 | 含义 | 典型入口 | +|------|------|----------| +| `Client_TCP` | 玩家/工具连区服的客户端 TCP | `ServerModule` `ClientTcpServer` | +| `CROSS_TCP` | 区服作为客户端连到跨服的那条链路上的入站 | `CrossModule` 接受 `CrossTcpClient` 连接 | + +同一 `service_id + method_id` 在两种来源下可对应 **不同** `GameCommand` 实现;`ProtoRegistry` 按 **来源 + service + method** 分别注册 `ProtoInfo`(CTS/STC 类型)。 + +## 三条客户端业务路径(概念) + +1. **路径 1**:区服本地处理(不经跨服)。 +2. **路径 2**:客户端 `CrossProxy*` → 区服转换为 `CrossForward*` → **跨服** → 回到区服组装 `CrossProxyStc`(含 `server_note`)。 +3. **路径 3**:客户端 payload 已是跨服 CTS 形态,区服仅改信封转发跨服,响应再换回原 service/method。 + +详见 [ServerModule/README.md](ServerModule/README.md)。 + +## 构建与运行 + +```bash +# 在仓库根目录 +mvn clean compile + +# 先起跨服,再起区服(路径 2/3 依赖跨服) +# CrossModuleApplication +# ServerModuleApplication +``` + +Proto 变更后需对 **ProtoBufModule** 执行 `mvn generate-sources`(或 `ProtoBufModule/genpb.bat`)。 + +## 日志 + +各区服/跨服进程通过各自 `logback-spring.xml` 将 **INFO/WARN** 与 **ERROR** 分文件写入 `app.logging.dir`(默认 `logs/ServerModule`、`logs/CrossModule`)。 diff --git a/ServerModule/README.md b/ServerModule/README.md new file mode 100644 index 0000000..abfc9da --- /dev/null +++ b/ServerModule/README.md @@ -0,0 +1,115 @@ +# ServerModule + +**区服进程**:同时提供 + +- **客户端游戏 TCP**(`game.client-tcp.port`,默认示例 **9091**):`CommandSource.Client_TCP` +- **连跨服的出站 TCP 长连接**(`cross.host` / `cross.port`,示例 **9200**):由 **`CrossTcpClient`** 维护,`ProtoRegistry` 中对应逻辑仍按跨服协议,但 **连接发起在区服** +- **HTTP**(`server.port`,默认 **8080**):Demo API、探针、静态探测页 + +## 总体数据流 + +```mermaid +flowchart TB + subgraph External["外部"] + GAME[游戏客户端 TCP] + BROWSER[浏览器 / HTTP 客户端] + end + subgraph Server["ServerModule"] + CTS[ClientTcpServer :9091] + HTTP[HTTP :8080] + REG[ServerCommandRegistry] + C2[TcpPath2 等命令] + CC[CrossTcpClient 长连接] + end + subgraph Cross["CrossModule :9200"] + XT[Cross TCP] + end + GAME --> CTS --> REG --> C2 + BROWSER --> HTTP + C2 --> CC --> XT +``` + +## 1. 客户端 TCP(主入口) + +- **`ClientTcpServer`**:`ApplicationReadyEvent` 后绑定端口(`@Order` 较早,保证先于跨服预热)。 +- **`ClientTcpChannelInitializer`**:解码器 + **`CmdRpcTcpFrameHandler`**(`linkSource = Client_TCP`,注入 **`ServerCommandRegistry`** 与 **`CrossTcpClient`** 作为 **`CrossRpcInvoker`**)。 + +```mermaid +sequenceDiagram + participant C as 客户端 + participant S as ClientTcpServer + participant R as ServerCommandRegistry + participant Cmd as GameCommand + participant X as CrossTcpClient + C->>S: 帧: CmdRpcEnvelope + S->>R: resolve(service, method) + R->>Cmd: execute + opt 路径2/3 + Cmd->>X: roundTrip(跨服信封) + X-->>Cmd: 跨服响应 + end + Cmd-->>S: 响应 CmdRpcEnvelope + S-->>C: 帧 +``` + +### 三条路径(概念对照) + +| 路径 | Client TCP service/method | 是否调跨服 | 说明 | +|------|---------------------------|------------|------| +| 1 | Service_1 / Method1 | 否 | Echo | +| 2 | Service_2 / Method2 | 是 | `CrossProxy*` → 转 `CrossForward*` → 跨服 → 回写 `CrossProxyStc`(含 `server_note`) | +| 3 | Service_3 / Method3 | 是 | 信封对客户端为 S3,payload 为 `CrossForwardCts`;区服只转发跨服 | + +实现类:`TcpPath1LocalEchoCommand`、`TcpPath2CrossThenServerCommand`、`TcpPath3CrossRelayCommand`。 + +## 2. 区服 → 跨服:`CrossTcpClient` + +- **单连接长连**:`ensureConnected()` 建链;断线后 `linkRegistered=false`,下次业务或心跳会重建。 +- **注册**:`Service_4` + `Register`,载荷 `CrossLinkRegisterCts`(`cross.server-id`、`cross.token`)。 +- **心跳**:`CrossTcpHeartbeatTask` 按 `cross.heartbeat-interval-ms`(默认 15000)调用 `sendHeartbeat()`(`Service_4` + `Heartbeat`)。 +- **多路复用**:每次 `roundTrip` 分配 **`link_seq`**,在 `pendingBySeq` 中挂 `CompletableFuture`;入站 **`dispatchInbound`** 按 `link_seq` 完成 Future。 + +```mermaid +stateDiagram-v2 + [*] --> Disconnected + Disconnected --> Connected: ensureConnected + Connected --> Registered: Service_4 Register OK + Registered --> Registered: roundTrip / Heartbeat + Registered --> Disconnected: 断链 / 心跳失败 +``` + +- **预热**:`CrossTcpClient.warmupCrossLink()` 监听 `ApplicationReadyEvent`(`@Order` 较低,在 **`ClientTcpServer` 绑定之后**),提前建链+注册。 + +配置示例见根目录 `README.md` 或本模块 `application.yml`: + +- `cross.host`、`cross.port`(须与 CrossModule `cross.tcp.port` 一致) +- `cross.server-id`、`cross.token`、`cross.heartbeat-interval-ms` + +## 3. HTTP + +- **`/api/ping`**(`PingController`):探活。 +- **`/api/config/client-tcp`**(`ClientTcpConfigController`):返回 `game.client-tcp.port`。 +- **`/api/demo/*`**:Mongo / Redis / 事件 / 模块 tick 等演示接口(见 `DemoApiController`)。 + +## 4. 其它 Demo(非网络核心) + +- MongoDB / Redis / 事件 / 玩家模块 tick 等:见 `com.huangzj.server` 下 `web`、`mongo`、`redis`、`module` 等包。 + +## 5. 本机命令行压测三条 TCP 路径 + +`com.huangzj.server.demo.TcpPathsDemo`:与客户端相同帧格式,默认 `127.0.0.1:9091`。 + +```bash +java -cp ... com.huangzj.server.demo.TcpPathsDemo [host] [port] +``` + +## 6. 日志 + +- `app.logging.dir`:默认 `logs/ServerModule` +- `logback-spring.xml`:`info.log`(INFO+WARN,不含 ERROR)与 `error.log`(仅 ERROR) + +## 7. 启动顺序建议 + +1. 启动 **CrossModule**(端口 9200)。 +2. 启动 **ServerModule**(HTTP 8080,客户端 TCP 9091)。 +3. 用 `TcpPathsDemo` 或自建 TCP 客户端按路径 2 组帧,可验证经区服到跨服的全链路。 diff --git a/ServerModule/pom.xml b/ServerModule/pom.xml new file mode 100644 index 0000000..4a0162e --- /dev/null +++ b/ServerModule/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + + huangzj + comm-framework + 0.0.1-SNAPSHOT + ../pom.xml + + + ServerModule + jar + ServerModule + + + + huangzj + ProtoBufModule + ${project.version} + + + huangzj + BaseModule + ${project.version} + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + org.springframework.boot + spring-boot-starter-data-redis + + + io.netty + netty-all + + + org.projectlombok + lombok + true + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + com.huangzj.server.ServerModuleApplication + + + + + diff --git a/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossLinkProperties.java b/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossLinkProperties.java new file mode 100644 index 0000000..cb469ab --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossLinkProperties.java @@ -0,0 +1,26 @@ +package com.huangzj.comm.crosslink; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 区服连跨服 TCP:地址、注册身份、心跳间隔(长连接维护)。 + */ +@Getter +@Setter +@ConfigurationProperties(prefix = "cross") +public class CrossLinkProperties { + + private String host; + private int port; + + /** 向跨服注册的区服实例 ID。 */ + private String serverId = "zone-1"; + + /** 与跨服约定的令牌,跨服 {@code cross.link.expected-token} 非空时会校验。 */ + private String token = ""; + + /** 心跳间隔(毫秒),仅在本进程已注册成功后发送。 */ + private int heartbeatIntervalMs = 15000; +} diff --git a/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossServerInboundHandler.java b/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossServerInboundHandler.java new file mode 100644 index 0000000..fe6684e --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossServerInboundHandler.java @@ -0,0 +1,52 @@ +package com.huangzj.comm.crosslink; + +import com.huangzj.base.frame.NettyBufUtil; +import com.huangzj.cmd.gen.CmdRpcEnvelope; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * 区服进程内:跨服经长连接发回的入站帧处理。 + * + *

跨服回包目的地是 区服(本进程),不是游戏客户端。客户端只连 {@link + * com.huangzj.server.net.ClientTcpServer};经跨服的逻辑由区服命令里 {@link CrossTcpClient#roundTrip} 等对跨服发包, + * 回包仍回到本 Handler,再按 {@link CmdRpcEnvelope#getLinkSeq()} 唤醒区服侧等待线程。 + * + *

命名说明:相对「游戏客户端」而言这里是 Server(区服) 侧;TCP 上区服对跨服仍是主动建连方,故 + * 建连类仍叫 {@link CrossTcpClient}。 + */ +@Slf4j +@RequiredArgsConstructor +public class CrossServerInboundHandler extends SimpleChannelInboundHandler { + + private final CrossTcpClient client; + + /** 一帧一 CmdRpcEnvelope,按 link_seq 配对区服内 pending 的 roundTrip/注册/心跳。 */ + @Override + protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception { + byte[] raw = NettyBufUtil.readReadableBytes(msg); + CmdRpcEnvelope env = CmdRpcEnvelope.parseFrom(raw); + client.dispatchInbound(env); + } + + /** + * 对端正常 FIN:未完成的 roundTrip/注册/心跳必须以异常结束,否则 {@link + * java.util.concurrent.CompletableFuture#get} 会一直挂起。 + */ + @Override + public void channelInactive(ChannelHandlerContext ctx) { + log.warn("Cross inbound channel inactive remote={}", ctx.channel().remoteAddress()); + client.failAllPending(new java.io.IOException("cross inactive")); + } + + /** 半包、PB 损坏、对端 RST 等:先失败所有 pending,再关 channel 防止重复读脏数据。 */ + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + log.error("Cross inbound error remote={}", ctx.channel().remoteAddress(), cause); + client.failAllPending(cause); + ctx.close(); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossTcpClient.java b/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossTcpClient.java new file mode 100644 index 0000000..32829c0 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossTcpClient.java @@ -0,0 +1,266 @@ +package com.huangzj.comm.crosslink; + +import com.huangzj.base.cmd.CrossRpcInvoker; +import com.huangzj.base.frame.LengthPrefixedProtobuf; +import com.huangzj.cmd.gen.CmdRpcEnvelope; +import com.huangzj.cmd.gen.CrossLinkHeartbeatCts; +import com.huangzj.cmd.gen.CrossLinkRegisterCts; +import com.huangzj.cmd.gen.CrossLinkRegisterStc; +import com.huangzj.cmd.gen.PbService; +import com.huangzj.cmd.gen.Service4_Method; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import jakarta.annotation.PreDestroy; +import java.io.IOException; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +/** + * 区服 → 跨服:单条长连接、启动后注册、定时心跳;业务 {@link #roundTrip} 通过 {@link CmdRpcEnvelope#getLinkSeq()} 多路复用。 + * + *

跨服回包进入 区服 进程,由 {@link CrossServerInboundHandler} 解析后 {@link #dispatchInbound};不直接写给游戏客户端。 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class CrossTcpClient implements CrossRpcInvoker { + + private final CrossLinkProperties properties; + private final EventLoopGroup group = new NioEventLoopGroup(1); + + private final ConcurrentHashMap> pendingBySeq = new ConcurrentHashMap<>(); + private final AtomicInteger seqGen = new AtomicInteger(1); + + private final Object connectLock = new Object(); + + private volatile Channel channel; + private volatile boolean linkRegistered; + + /** 生成非 0 序号:0 在 proto3 里表示「未设置」,不能用作 link_seq 去匹配 pending。 */ + private static int nonZeroSeq(AtomicInteger gen) { + int v = gen.incrementAndGet(); + if (v == 0) { + v = gen.incrementAndGet(); + } + return v; + } + + private int nextSeq() { + return nonZeroSeq(seqGen); + } + + /** + * 建链(幂等)。与注册共用同一把锁,避免「边连边注册」交错。 新 TCP 建立后必须重新走注册,故先把 + * linkRegistered 置 false。 + */ + private void ensureConnected() throws InterruptedException { + synchronized (connectLock) { + if (channel != null && channel.isActive()) { + return; + } + // 旧连接已不可用或首次连接:后续必须重新 Service_4 Register + linkRegistered = false; + log.info("Connecting cross TCP (long link) {}:{}", properties.getHost(), properties.getPort()); + CrossServerInboundHandler inbound = new CrossServerInboundHandler(this); + Bootstrap b = new Bootstrap(); + b.group(group) + .channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) { + // 与跨服约定一致:4 字节大端长度 + CmdRpcEnvelope + ch.pipeline().addLast(LengthPrefixedProtobuf.newTcpFrameDecoder()); + ch.pipeline().addLast(inbound); + } + }); + ChannelFuture f = b.connect(properties.getHost(), properties.getPort()).sync(); + channel = f.channel(); + log.info("Cross TCP connected {}", channel.remoteAddress()); + // 对端或本端关闭时:清 channel、作废注册态,并把仍在等的 Future 全部失败掉,防止永久阻塞 + channel + .closeFuture() + .addListener(cf -> { + channel = null; + linkRegistered = false; + failAllPending(new IOException("cross TCP disconnected")); + log.warn("Cross TCP channel closed"); + }); + } + } + + /** + * 双检锁:无锁快速路径(已注册)+ 与建链同锁的注册临界区,保证同一时刻只有一条注册在进行。 注册响应同样带 + * link_seq,由 {@link #dispatchInbound} 完成 Future;finally 再 remove 一次防止超时等异常泄漏 map 条目。 + */ + private void ensureRegistered() throws Exception { + if (linkRegistered) { + return; + } + synchronized (connectLock) { + if (linkRegistered) { + return; + } + if (channel == null || !channel.isActive()) { + throw new IllegalStateException("cross channel not active"); + } + CrossLinkRegisterCts cts = + CrossLinkRegisterCts.newBuilder() + .setServerId(properties.getServerId() == null ? "" : properties.getServerId()) + .setToken(properties.getToken() == null ? "" : properties.getToken()) + .build(); + int id = nextSeq(); + CompletableFuture f = new CompletableFuture<>(); + pendingBySeq.put(id, f); + try { + CmdRpcEnvelope env = CmdRpcEnvelope.newBuilder() + .setServiceId(PbService.Service_4_VALUE) + .setMethodId(Service4_Method.Register_VALUE) + .setPayload(cts.toByteString()) + .setLinkSeq(id) + .build(); + channel.writeAndFlush(LengthPrefixedProtobuf.encodeMessage(channel.alloc(), env)); + // 注册允许稍长等待:跨服进程若刚启动,首次解析/建表可能略慢 + CmdRpcEnvelope res = f.get(10, TimeUnit.SECONDS); + CrossLinkRegisterStc st = CrossLinkRegisterStc.parseFrom(res.getPayload()); + if (!st.getOk()) { + linkRegistered = false; + throw new IllegalStateException("cross register rejected: " + st.getMessage()); + } + linkRegistered = true; + log.info("Cross link registered ok serverId={}", properties.getServerId()); + } finally { + pendingBySeq.remove(id, f); + } + } + } + + /** Spring 就绪后主动建链并完成注册,缩短首包 RTT(在区服客户端 TCP 绑定之后执行)。 */ + @Order(Ordered.LOWEST_PRECEDENCE) + @EventListener(ApplicationReadyEvent.class) + public void warmupCrossLink() { + try { + // 失败不阻止 Spring 启动:首条业务 roundTrip 或心跳会再次尝试建链+注册 + ensureConnected(); + ensureRegistered(); + } catch (Exception e) { + log.warn("Cross link warmup failed (is CrossModule up?): {}", e.toString()); + } + } + + /** + * 发一帧等一帧;自动分配 {@link CmdRpcEnvelope.Builder#setLinkSeq(int)},与跨服回包对齐。 + */ + @Override + public CmdRpcEnvelope roundTrip(CmdRpcEnvelope request) throws Exception { + // 业务调用前保证链路可用;link_seq 由本客户端统一分配,覆盖调用方传入值(避免冲突) + ensureConnected(); + ensureRegistered(); + int id = nextSeq(); + CompletableFuture f = new CompletableFuture<>(); + pendingBySeq.put(id, f); + try { + CmdRpcEnvelope out = request.toBuilder().setLinkSeq(id).build(); + Channel ch = channel; + if (ch == null || !ch.isActive()) { + throw new IOException("cross channel inactive"); + } + ch.writeAndFlush(LengthPrefixedProtobuf.encodeMessage(ch.alloc(), out)); + // 回包在 IO 线程里 complete,当前线程阻塞等待;超时由调用方感知 + return f.get(5, TimeUnit.SECONDS); + } finally { + // 正常时 dispatchInbound 已按 seq remove;此处兜底防超时/异常导致 map 堆积 + pendingBySeq.remove(id, f); + } + } + + /** + * 供调度器定时调用:与业务 roundTrip 共用 pending 表与 link_seq 规则。 失败时主动关连接,迫使后续走 + * ensureConnected 重建,避免半开连接一直占着注册态。 + */ + public void sendHeartbeat() { + try { + ensureConnected(); + ensureRegistered(); + int id = nextSeq(); + CompletableFuture f = new CompletableFuture<>(); + pendingBySeq.put(id, f); + try { + CrossLinkHeartbeatCts cts = + CrossLinkHeartbeatCts.newBuilder().setClientTimeMs(System.currentTimeMillis()).build(); + CmdRpcEnvelope env = CmdRpcEnvelope.newBuilder() + .setServiceId(PbService.Service_4_VALUE) + .setMethodId(Service4_Method.Heartbeat_VALUE) + .setPayload(cts.toByteString()) + .setLinkSeq(id) + .build(); + Channel ch = channel; + if (ch == null || !ch.isActive()) { + return; + } + ch.writeAndFlush(LengthPrefixedProtobuf.encodeMessage(ch.alloc(), env)); + // 心跳要快失败:超时说明对端卡死或网络异常,交给 catch 关连接 + f.get(3, TimeUnit.SECONDS); + if (log.isDebugEnabled()) { + log.debug("Cross heartbeat ok"); + } + } finally { + pendingBySeq.remove(id, f); + } + } catch (Exception e) { + log.warn("Cross heartbeat failed: {}", e.toString()); + linkRegistered = false; + Channel ch = channel; + if (ch != null) { + ch.close(); + } + } + } + + /** Netty IO 线程调用:按 link_seq 唤醒对应阻塞中的 roundTrip/注册/心跳。 */ + public void dispatchInbound(CmdRpcEnvelope env) { + int seq = env.getLinkSeq(); + if (seq == 0) { + // 区服↔跨服约定必须带 seq;0 无法配对,多半是异常包或旧版本 + log.warn("Cross inbound ignored: link_seq=0 service={} method={}", env.getServiceId(), env.getMethodId()); + return; + } + CompletableFuture cf = pendingBySeq.remove(seq); + if (cf != null) { + cf.complete(env); + } else { + // 重复包、乱序或已超时被 finally 清理后迟到到达 + log.warn("Cross inbound no pending for link_seq={}", seq); + } + } + + /** 连接断开或 pipeline 异常:让所有等待方立即收到异常,避免业务线程永久卡在 get()。 */ + public void failAllPending(Throwable t) { + pendingBySeq.values().forEach(f -> f.completeExceptionally(t)); + pendingBySeq.clear(); + } + + @PreDestroy + public void stop() { + Channel ch = channel; + if (ch != null) { + ch.close(); + } + // 与 Netty 惯例一致:尽快结束线程组,不拉长停机时间 + group.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossTcpHeartbeatTask.java b/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossTcpHeartbeatTask.java new file mode 100644 index 0000000..e402615 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/comm/crosslink/CrossTcpHeartbeatTask.java @@ -0,0 +1,22 @@ +package com.huangzj.comm.crosslink; + +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** 区服侧跨服长连接心跳(间隔见 {@code cross.heartbeat-interval-ms})。 */ +@Component +@RequiredArgsConstructor +public class CrossTcpHeartbeatTask { + + private final CrossTcpClient crossTcpClient; + + /** + * fixedDelay:上一次执行结束后再隔 interval 执行,避免心跳堆积把 IO 线程打满。 与业务 roundTrip + * 并发时靠 link_seq 区分,无需额外串行化。 + */ + @Scheduled(fixedDelayString = "${cross.heartbeat-interval-ms:15000}") + public void heartbeat() { + crossTcpClient.sendHeartbeat(); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/ServerModuleApplication.java b/ServerModule/src/main/java/com/huangzj/server/ServerModuleApplication.java new file mode 100644 index 0000000..30899f9 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/ServerModuleApplication.java @@ -0,0 +1,20 @@ +package com.huangzj.server; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 区服 + 各种 demo:HTTP、两条 WebSocket、Mongo/Redis、定时模块 tick 都在这儿。 + */ +@SpringBootApplication(scanBasePackages = "com.huangzj") +@ConfigurationPropertiesScan(basePackages = "com.huangzj") +@EnableScheduling +public class ServerModuleApplication { + + /** 入口:扫整个 com.huangzj,配置类、Netty、调度器一并起来。 */ + public static void main(String[] args) { + SpringApplication.run(ServerModuleApplication.class, args); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/cmd/ServerCommandRegistry.java b/ServerModule/src/main/java/com/huangzj/server/cmd/ServerCommandRegistry.java new file mode 100644 index 0000000..9deb6e8 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/cmd/ServerCommandRegistry.java @@ -0,0 +1,16 @@ +package com.huangzj.server.cmd; + +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.base.spring.SpringGameCommandRegistry; +import java.util.EnumSet; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +/** 区服:仅处理客户端 TCP 上来的 {@link CommandSource#Client_TCP} 命令(三条路径都在此注册)。 */ +@Component +public class ServerCommandRegistry extends SpringGameCommandRegistry { + + public ServerCommandRegistry(ApplicationContext applicationContext) { + super(applicationContext, EnumSet.of(CommandSource.Client_TCP)); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath1LocalEchoCommand.java b/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath1LocalEchoCommand.java new file mode 100644 index 0000000..2bf9942 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath1LocalEchoCommand.java @@ -0,0 +1,24 @@ +package com.huangzj.server.cmd.cmds; + +import com.huangzj.base.cmd.AbstractTypedPbCommand; +import com.huangzj.base.cmd.Cmd; +import com.huangzj.base.cmd.CommandContext; +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.cmd.gen.CmdEchoCts; +import com.huangzj.cmd.gen.CmdEchoStc; +import com.huangzj.cmd.gen.PbService; +import com.huangzj.cmd.gen.Service1_Method; +import org.springframework.stereotype.Component; + +/** + * 路径1:客户端 → 区服,区服本地处理完直接回包(不经跨服)。 + */ +@Component +@Cmd(source = CommandSource.Client_TCP, serviceId = PbService.Service_1_VALUE, methodId = Service1_Method.Method1_VALUE) +public class TcpPath1LocalEchoCommand extends AbstractTypedPbCommand { + + @Override + protected void run(CommandContext ctx, CmdEchoCts cts, CmdEchoStc.Builder stcBuilder) { + stcBuilder.setText(cts.getText()).setServerTimeMs(System.currentTimeMillis()); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath2CrossThenServerCommand.java b/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath2CrossThenServerCommand.java new file mode 100644 index 0000000..c1c4830 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath2CrossThenServerCommand.java @@ -0,0 +1,50 @@ +package com.huangzj.server.cmd.cmds; + +import com.huangzj.base.cmd.AbstractTypedPbCommand; +import com.huangzj.base.cmd.Cmd; +import com.huangzj.base.cmd.CommandContext; +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.base.cmd.CrossRpcInvoker; +import com.huangzj.cmd.gen.CmdRpcEnvelope; +import com.huangzj.cmd.gen.CrossForwardCts; +import com.huangzj.cmd.gen.CrossForwardStc; +import com.huangzj.cmd.gen.CrossProxyCts; +import com.huangzj.cmd.gen.CrossProxyStc; +import com.huangzj.cmd.gen.PbService; +import com.huangzj.cmd.gen.Service2_Method; +import org.springframework.stereotype.Component; + +/** + * 路径2:客户端 → 区服 → 跨服处理 → 回到区服再加工 → 回客户端。 + * 跨服侧为 {@link PbService#Service_2} + {@link Service2_Method#Method2}。 + */ +@Component +@Cmd( + source = CommandSource.Client_TCP, + serviceId = PbService.Service_2_VALUE, + methodId = Service2_Method.Method2_VALUE) +public class TcpPath2CrossThenServerCommand extends AbstractTypedPbCommand { + + @Override + protected void run(CommandContext ctx, CrossProxyCts cts, CrossProxyStc.Builder stcBuilder) throws Exception { + CrossRpcInvoker inv = ctx.crossRpc(); + if (inv == null) { + throw new IllegalStateException("cross unavailable"); + } + // 客户端协议是 CrossProxy*;跨服只认 CrossForward*,这里在区服内做一次「外壳→内壳」转换 + CrossForwardCts forward = CrossForwardCts.newBuilder().setTrace(cts.getTrace()).build(); + CmdRpcEnvelope toCross = CmdRpcEnvelope.newBuilder() + .setServiceId(PbService.Service_2_VALUE) + .setMethodId(Service2_Method.Method2_VALUE) + .setPayload(forward.toByteString()) + .build(); + // CrossTcpClient 会为该CmdRpcEnvelope写入 link_seq 并同步等跨服回包 + CmdRpcEnvelope back = inv.roundTrip(toCross); + CrossForwardStc cfs = CrossForwardStc.parseFrom(back.getPayload()); + // 把跨服结果写回客户端协议的 STC,并追加区服侧字段证明二次处理过 + stcBuilder + .setTrace(cfs.getTrace()) + .setCrossTimeMs(cfs.getCrossTimeMs()) + .setServerNote("path2: server after cross @" + System.currentTimeMillis()); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath3CrossRelayCommand.java b/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath3CrossRelayCommand.java new file mode 100644 index 0000000..4486c17 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/cmd/cmds/TcpPath3CrossRelayCommand.java @@ -0,0 +1,47 @@ +package com.huangzj.server.cmd.cmds; + +import com.huangzj.base.cmd.Cmd; +import com.huangzj.base.cmd.CommandContext; +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.base.cmd.CrossRpcInvoker; +import com.huangzj.base.cmd.GameCommand; +import com.huangzj.cmd.gen.CmdRpcEnvelope; +import com.huangzj.cmd.gen.PbService; +import com.huangzj.cmd.gen.Service2_Method; +import com.huangzj.cmd.gen.Service3_Method; +import org.springframework.stereotype.Component; + +/** + * 路径3:客户端 → 区服 → 跨服处理 → 回到区服只做透明中转。 + * 请求体须与跨服 {@link PbService#Service_2} + {@link Service2_Method#Method2} 的 CTS 一致。 + */ +@Component +@Cmd( + source = CommandSource.Client_TCP, + serviceId = PbService.Service_3_VALUE, + methodId = Service3_Method.Method3_VALUE) +public class TcpPath3CrossRelayCommand implements GameCommand { + + @Override + public CmdRpcEnvelope execute(CommandContext ctx, CmdRpcEnvelope request) throws Exception { + CrossRpcInvoker inv = ctx.crossRpc(); + if (inv == null) { + throw new IllegalStateException("cross unavailable"); + } + // 路径3:客户端 payload 已是跨服 CTS 形态,区服只改CmdRpcEnvelope上的 service/method 指向跨服接口 + CmdRpcEnvelope toCross = CmdRpcEnvelope.newBuilder() + .setServiceId(PbService.Service_2_VALUE) + .setMethodId(Service2_Method.Method2_VALUE) + .setPayload(request.getPayload()) + .build(); + CmdRpcEnvelope back = inv.roundTrip(toCross); + // 对客户端仍表现为 Service_3/Method3;link_seq 沿用入站请求,跨服侧 seq 由 CrossTcpClient 单独维护 + return CmdRpcEnvelope.newBuilder() + .setServiceId(request.getServiceId()) + .setMethodId(request.getMethodId()) + .setCrossRet(request.getCrossRet()) + .setLinkSeq(request.getLinkSeq()) + .setPayload(back.getPayload()) + .build(); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/config/AppProperties.java b/ServerModule/src/main/java/com/huangzj/server/config/AppProperties.java new file mode 100644 index 0000000..f4cd458 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/config/AppProperties.java @@ -0,0 +1,43 @@ +package com.huangzj.server.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 和业务 demo 相关的配置,都挂在 app.* 下面,省得满天找字符串。 + */ +@Getter +@ConfigurationProperties(prefix = "app") +public class AppProperties { + + /** Mongo 集合名等。 */ + private final Mongo mongo = new Mongo(); + /** 定时刷盘间隔。 */ + private final Save save = new Save(); + /** 假玩家、模块 tick 间隔。 */ + private final Module module = new Module(); + + @Getter + @Setter + public static class Mongo { + /** demo 文档往哪个 collection 塞。 */ + private String collection; + } + + @Getter + @Setter + public static class Save { + /** 多久触发一次批量/延迟保存(看 DemoMongoService 怎么用)。 */ + private long intervalMs; + } + + @Getter + @Setter + public static class Module { + /** 宿主 Bean 里的 playerId。 */ + private long playerId; + /** 调度器多久叫醒一次模块 tick。 */ + private long tickIntervalMs; + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/config/ClientTcpProperties.java b/ServerModule/src/main/java/com/huangzj/server/config/ClientTcpProperties.java new file mode 100644 index 0000000..1366f65 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/config/ClientTcpProperties.java @@ -0,0 +1,14 @@ +package com.huangzj.server.config; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** 客户端 → 区服的 CmdRpc TCP(4 字节长度前缀 + CmdRpcEnvelope)。 */ +@Getter +@Setter +@ConfigurationProperties(prefix = "game.client-tcp") +public class ClientTcpProperties { + + private int port; +} diff --git a/ServerModule/src/main/java/com/huangzj/server/demo/TcpPathsDemo.java b/ServerModule/src/main/java/com/huangzj/server/demo/TcpPathsDemo.java new file mode 100644 index 0000000..02e94ec --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/demo/TcpPathsDemo.java @@ -0,0 +1,96 @@ +package com.huangzj.server.demo; + +import com.huangzj.cmd.gen.CmdEchoCts; +import com.huangzj.cmd.gen.CmdEchoStc; +import com.huangzj.cmd.gen.CmdRpcEnvelope; +import com.huangzj.cmd.gen.CrossForwardCts; +import com.huangzj.cmd.gen.CrossForwardStc; +import com.huangzj.cmd.gen.CrossProxyCts; +import com.huangzj.cmd.gen.CrossProxyStc; +import com.huangzj.cmd.gen.PbService; +import com.huangzj.cmd.gen.Service1_Method; +import com.huangzj.cmd.gen.Service2_Method; +import com.huangzj.cmd.gen.Service3_Method; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.net.Socket; + +/** + * 命令行压测三条客户端 TCP 路径:帧格式与区服 {@link com.huangzj.base.net.CmdRpcTcpFrameHandler} 一致。 + * + *

运行:{@code java -cp ... com.huangzj.server.demo.TcpPathsDemo [host] [port]} + */ +public final class TcpPathsDemo { + + private TcpPathsDemo() {} + + public static void main(String[] args) throws Exception { + String host = args.length > 0 ? args[0] : "127.0.0.1"; + int port = args.length > 1 ? Integer.parseInt(args[1]) : 9091; + try (Socket socket = new Socket(host, port)) { + socket.setSoTimeout(60_000); + System.out.println("connected " + host + ":" + port); + + path1(socket); + path2(socket); + path3(socket); + } + } + + private static void path1(Socket socket) throws Exception { + CmdRpcEnvelope req = CmdRpcEnvelope.newBuilder() + .setServiceId(PbService.Service_1_VALUE) + .setMethodId(Service1_Method.Method1_VALUE) + .setPayload(CmdEchoCts.newBuilder() + .setText("path1-echo") + .build() + .toByteString()) + .build(); + CmdRpcEnvelope resp = sendRecv(socket, req); + CmdEchoStc stc = CmdEchoStc.parseFrom(resp.getPayload()); + System.out.println("[path1] echo=" + stc.getText() + " serverTime=" + stc.getServerTimeMs()); + } + + private static void path2(Socket socket) throws Exception { + CmdRpcEnvelope req = CmdRpcEnvelope.newBuilder() + .setServiceId(PbService.Service_2_VALUE) + .setMethodId(Service2_Method.Method2_VALUE) + .setPayload(CrossProxyCts.newBuilder() + .setTrace("path2-trace") + .build() + .toByteString()) + .build(); + CmdRpcEnvelope resp = sendRecv(socket, req); + CrossProxyStc stc = CrossProxyStc.parseFrom(resp.getPayload()); + System.out.println("[path2] trace=" + stc.getTrace() + + " crossTime=" + stc.getCrossTimeMs() + + " note=" + stc.getServerNote()); + } + + private static void path3(Socket socket) throws Exception { + CmdRpcEnvelope req = CmdRpcEnvelope.newBuilder() + .setServiceId(PbService.Service_3_VALUE) + .setMethodId(Service3_Method.Method3_VALUE) + .setPayload(CrossForwardCts.newBuilder() + .setTrace("path3-trace") + .build() + .toByteString()) + .build(); + CmdRpcEnvelope resp = sendRecv(socket, req); + CrossForwardStc stc = CrossForwardStc.parseFrom(resp.getPayload()); + System.out.println("[path3] trace=" + stc.getTrace() + " crossTime=" + stc.getCrossTimeMs()); + } + + private static CmdRpcEnvelope sendRecv(Socket socket, CmdRpcEnvelope env) throws Exception { + byte[] body = env.toByteArray(); + DataOutputStream out = new DataOutputStream(socket.getOutputStream()); + out.writeInt(body.length); + out.write(body); + out.flush(); + DataInputStream in = new DataInputStream(socket.getInputStream()); + int len = in.readInt(); + byte[] resp = new byte[len]; + in.readFully(resp); + return CmdRpcEnvelope.parseFrom(resp); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/event/AppDomainEvent.java b/ServerModule/src/main/java/com/huangzj/server/event/AppDomainEvent.java new file mode 100644 index 0000000..9a698cf --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/event/AppDomainEvent.java @@ -0,0 +1,22 @@ +package com.huangzj.server.event; + +import lombok.Getter; +import org.springframework.context.ApplicationEvent; + +/** + * 随便造的一个领域事件,演示 Spring 事件总线怎么接。 + */ +@Getter +public class AppDomainEvent extends ApplicationEvent { + + /** 事件分类,监听方可以按 topic 过滤。 */ + private final String topic; + /** 随便塞的字符串负载。 */ + private final String body; + + public AppDomainEvent(Object source, String topic, String body) { + super(source); + this.topic = topic; + this.body = body; + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/event/DemoEventListener.java b/ServerModule/src/main/java/com/huangzj/server/event/DemoEventListener.java new file mode 100644 index 0000000..8802b91 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/event/DemoEventListener.java @@ -0,0 +1,35 @@ +package com.huangzj.server.event; + +import java.util.concurrent.atomic.AtomicInteger; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; + +/** + * 随便听听 {@link AppDomainEvent},记一下次数和最后一条,方便 HTTP 查状态。 + */ +@Component +public class DemoEventListener { + + private final AtomicInteger receiveCount = new AtomicInteger(); + private volatile String lastTopic; + private volatile String lastBody; + + @EventListener + public void onDomain(AppDomainEvent event) { + receiveCount.incrementAndGet(); + lastTopic = event.getTopic(); + lastBody = event.getBody(); + } + + public int getReceiveCount() { + return receiveCount.get(); + } + + public String getLastTopic() { + return lastTopic; + } + + public String getLastBody() { + return lastBody; + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/module/DemoAuxModule.java b/ServerModule/src/main/java/com/huangzj/server/module/DemoAuxModule.java new file mode 100644 index 0000000..90f52fc --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/module/DemoAuxModule.java @@ -0,0 +1,39 @@ +package com.huangzj.server.module; + +import com.huangzj.base.module.GeneralModule; +import com.huangzj.base.module.ModuleMetricsProvider; +import com.huangzj.base.module.PlayerModule; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; +import org.springframework.stereotype.Component; + +@Component +@PlayerModule(order = 20) +public class DemoAuxModule extends GeneralModule implements ModuleMetricsProvider { + + private final AtomicLong tickCount = new AtomicLong(); + + public DemoAuxModule(DemoPlayerHost host) { + super(host); + enableTick(); + } + + /** 与 SamplePlayerModule 同一个宿主,playerId 一致。 */ + @Override + public long getPlayerId() { + return getPlayer().getPlayerId(); + } + + @Override + protected void tick(long runAt) { + tickCount.incrementAndGet(); + } + + @Override + public Map metrics() { + Map m = new LinkedHashMap<>(); + m.put("auxTickCount", tickCount.get()); + return m; + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/module/DemoPlayerHost.java b/ServerModule/src/main/java/com/huangzj/server/module/DemoPlayerHost.java new file mode 100644 index 0000000..c4f1e95 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/module/DemoPlayerHost.java @@ -0,0 +1,14 @@ +package com.huangzj.server.module; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +/** + * Demo 里假装有个「玩家宿主」,模块都从这儿拿 playerId。 + */ +@Getter +@RequiredArgsConstructor +public class DemoPlayerHost { + + private final long playerId; +} diff --git a/ServerModule/src/main/java/com/huangzj/server/module/DemoPlayerHostBean.java b/ServerModule/src/main/java/com/huangzj/server/module/DemoPlayerHostBean.java new file mode 100644 index 0000000..41c01a4 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/module/DemoPlayerHostBean.java @@ -0,0 +1,14 @@ +package com.huangzj.server.module; + +import com.huangzj.server.config.AppProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DemoPlayerHostBean { + + @Bean + public DemoPlayerHost demoPlayerHost(AppProperties appProperties) { + return new DemoPlayerHost(appProperties.getModule().getPlayerId()); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/module/ModuleTickScheduler.java b/ServerModule/src/main/java/com/huangzj/server/module/ModuleTickScheduler.java new file mode 100644 index 0000000..91c2617 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/module/ModuleTickScheduler.java @@ -0,0 +1,24 @@ +package com.huangzj.server.module; + +import com.huangzj.base.spring.module.PlayerModuleRegistry; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 按配置的节奏喊所有 GeneralModule 跑一遍 tick;手痒也可以走 HTTP 再触发一次。 + */ +@Component +@RequiredArgsConstructor +public class ModuleTickScheduler { + + private final PlayerModuleRegistry playerModuleRegistry; + + /** + * fixedDelay:上一轮跑完再等间隔;占位符缺了就用 8000ms,免得本地没配启动失败。 + */ + @Scheduled(fixedDelayString = "${app.module.tick-interval-ms:8000}") + public void scheduledTick() { + playerModuleRegistry.runTickAll(System.currentTimeMillis()); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/module/SamplePlayerModule.java b/ServerModule/src/main/java/com/huangzj/server/module/SamplePlayerModule.java new file mode 100644 index 0000000..fc9044f --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/module/SamplePlayerModule.java @@ -0,0 +1,54 @@ +package com.huangzj.server.module; + +import com.huangzj.base.module.GeneralModule; +import com.huangzj.base.module.ModuleMetricsProvider; +import com.huangzj.base.module.PlayerModule; +import com.huangzj.server.mongo.DemoMongoService; +import com.huangzj.server.mongo.DemoPayloadDoc; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicLong; +import org.springframework.stereotype.Component; + +/** + * Demo 主模块:每次 tick 打个计数,save 时往 Mongo 扔一条,方便你看链路是活的。 + */ +@Component +@PlayerModule(order = 10) +public class SamplePlayerModule extends GeneralModule implements ModuleMetricsProvider { + + private final DemoMongoService mongoService; + private final AtomicLong tickCount = new AtomicLong(); + + public SamplePlayerModule(DemoPlayerHost host, DemoMongoService mongoService) { + super(host); + this.mongoService = mongoService; + enableTick(); + } + + @Override + public long getPlayerId() { + return getPlayer().getPlayerId(); + } + + @Override + protected void tick(long runAt) { + tickCount.incrementAndGet(); + } + + @Override + public boolean saveData() { + DemoPayloadDoc doc = new DemoPayloadDoc(); + doc.setPlayerId(getPlayerId()); + doc.setContent("tick-save-" + System.currentTimeMillis()); + mongoService.saveImmediate(doc); + return true; + } + + @Override + public Map metrics() { + Map m = new LinkedHashMap<>(); + m.put("sampleTickCount", tickCount.get()); + return m; + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/mongo/DemoMongoService.java b/ServerModule/src/main/java/com/huangzj/server/mongo/DemoMongoService.java new file mode 100644 index 0000000..fd9b468 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/mongo/DemoMongoService.java @@ -0,0 +1,54 @@ +package com.huangzj.server.mongo; + +import com.huangzj.server.config.AppProperties; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class DemoMongoService { + + private final MongoTemplate mongoTemplate; + private final AppProperties appProperties; + private volatile DemoPayloadDoc scheduledDoc; + + public DemoMongoService(MongoTemplate mongoTemplate, AppProperties appProperties) { + this.mongoTemplate = mongoTemplate; + this.appProperties = appProperties; + } + + @Scheduled(fixedDelayString = "${app.save.interval-ms}") + public void flushScheduled() { + DemoPayloadDoc doc = scheduledDoc; + if (doc == null) { + return; + } + scheduledDoc = null; + try { + saveImmediate(doc); + log.info("scheduled mongo save playerId={}", doc.getPlayerId()); + } catch (Exception e) { + log.error("scheduled save failed", e); + } + } + + public void scheduleSave(DemoPayloadDoc doc) { + this.scheduledDoc = doc; + } + + public DemoPayloadDoc saveImmediate(DemoPayloadDoc doc) { + return mongoTemplate.save(doc, appProperties.getMongo().getCollection()); + } + + public DemoPayloadDoc findLatestByPlayer(long playerId) { + Query q = new Query(Criteria.where("playerId").is(playerId)) + .with(Sort.by(Sort.Direction.DESC, "_id")) + .limit(1); + return mongoTemplate.findOne(q, DemoPayloadDoc.class, appProperties.getMongo().getCollection()); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/mongo/DemoPayloadDoc.java b/ServerModule/src/main/java/com/huangzj/server/mongo/DemoPayloadDoc.java new file mode 100644 index 0000000..a4f7624 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/mongo/DemoPayloadDoc.java @@ -0,0 +1,18 @@ +package com.huangzj.server.mongo; + +import lombok.Data; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +/** + * Demo 用的 Mongo 文档,字段很少,主要验证存取链路。 + */ +@Data +@Document +public class DemoPayloadDoc { + + @Id + private String id; + private long playerId; + private String content; +} diff --git a/ServerModule/src/main/java/com/huangzj/server/net/ClientTcpChannelInitializer.java b/ServerModule/src/main/java/com/huangzj/server/net/ClientTcpChannelInitializer.java new file mode 100644 index 0000000..b0b275b --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/net/ClientTcpChannelInitializer.java @@ -0,0 +1,35 @@ +package com.huangzj.server.net; + +import com.huangzj.base.cmd.CommandSource; +import com.huangzj.base.cmd.ProtoRegistry; +import com.huangzj.base.frame.LengthPrefixedProtobuf; +import com.huangzj.base.net.CmdRpcTcpFrameHandler; +import com.huangzj.comm.crosslink.CrossTcpClient; +import com.huangzj.server.cmd.ServerCommandRegistry; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.socket.SocketChannel; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +/** + * 区服客户端 TCP:pipeline 上挂帧解码 + CmdRpc 业务 handler。 + */ +@Component +@RequiredArgsConstructor +public class ClientTcpChannelInitializer extends ChannelInitializer { + + private final ServerCommandRegistry serverCommandRegistry; + private final CrossTcpClient crossTcpClient; + private final ProtoRegistry protoRegistry; + + @Override + protected void initChannel(SocketChannel ch) { + ch.pipeline().addLast(LengthPrefixedProtobuf.newTcpFrameDecoder()); + ch.pipeline() + .addLast(new CmdRpcTcpFrameHandler( + serverCommandRegistry, + crossTcpClient, + CommandSource.Client_TCP, + protoRegistry)); + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/net/ClientTcpServer.java b/ServerModule/src/main/java/com/huangzj/server/net/ClientTcpServer.java new file mode 100644 index 0000000..c49883d --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/net/ClientTcpServer.java @@ -0,0 +1,94 @@ +package com.huangzj.server.net; + +import com.huangzj.server.config.ClientTcpProperties; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import jakarta.annotation.PreDestroy; +import java.net.BindException; +import java.util.concurrent.TimeUnit; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +/** + * 客户端 TCP 入口:与跨服侧帧格式一致,业务仅通过 {@code @Cmd}({@link com.huangzj.server.cmd.ServerCommandRegistry})。 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class ClientTcpServer { + + private final ClientTcpProperties properties; + private final ClientTcpChannelInitializer clientTcpChannelInitializer; + private EventLoopGroup bossGroup; + private EventLoopGroup workerGroup; + private Channel serverChannel; + + @Order(Ordered.HIGHEST_PRECEDENCE) + @EventListener(ApplicationReadyEvent.class) + public void start() throws InterruptedException { + bossGroup = new NioEventLoopGroup(1); + workerGroup = new NioEventLoopGroup(); + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childHandler(clientTcpChannelInitializer); + serverChannel = b.bind(properties.getPort()).sync().channel(); + log.info("Client TCP (game) listening on {}", properties.getPort()); + } catch (Exception e) { + if (findBindException(e) != null) { + shutdownGroupsOnly(); + int port = properties.getPort(); + throw new IllegalStateException( + "区服客户端 TCP 端口 " + + port + + " 已被占用。请关闭占用进程或在 application.yml 修改 game.client-tcp.port。", + e); + } + shutdownGroupsOnly(); + throw e; + } + } + + private static BindException findBindException(Throwable t) { + while (t != null) { + if (t instanceof BindException) { + return (BindException) t; + } + t = t.getCause(); + } + return null; + } + + private void shutdownGroupsOnly() { + if (bossGroup != null) { + bossGroup.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + bossGroup = null; + } + if (workerGroup != null) { + workerGroup.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + workerGroup = null; + } + } + + @PreDestroy + public void stop() throws InterruptedException { + if (serverChannel != null) { + serverChannel.close().syncUninterruptibly(); + } + if (bossGroup != null) { + bossGroup.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + } + if (workerGroup != null) { + workerGroup.shutdownGracefully(0, 1, TimeUnit.SECONDS).syncUninterruptibly(); + } + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/redis/RedisUtil.java b/ServerModule/src/main/java/com/huangzj/server/redis/RedisUtil.java new file mode 100644 index 0000000..72481c3 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/redis/RedisUtil.java @@ -0,0 +1,609 @@ +package com.huangzj.server.redis; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Range; +import org.springframework.data.redis.core.Cursor; +import org.springframework.data.redis.core.ScanOptions; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.stereotype.Component; + +/** + * 基于 {@link StringRedisTemplate} 的 Redis 常用数据结构封装,供业务注入使用。 + * + *

约定:所有 value / member / field 均按 字符串 与 Redis 交互;若需存对象,请用 {@link + * #setJson}/{@link #getJson} 或 Hash 字段级 {@link #hashSetJson}/{@link #hashGetJson}(Jackson 序列化)。 + * + *

方法名前缀含义:{@code str} 字符串、{@code hash} 哈希表、{@code list} 列表、{@code set} 集合、{@code zSet} + * 有序集合;未命中 key 时返回值多为 {@code null},与 Spring Data Redis 行为一致。 + */ +@Component +@RequiredArgsConstructor +public class RedisUtil { + + private final StringRedisTemplate redis; + private final ObjectMapper objectMapper; + + // region String(Redis String / Value) + + /** 写入字符串,无过期时间。 */ + public void strSet(String key, String value) { + redis.opsForValue().set(key, value); + } + + /** 写入字符串并设置存活时间。 */ + public void strSet(String key, String value, Duration ttl) { + redis.opsForValue().set(key, value, ttl); + } + + /** 仅当 key 不存在时写入;成功返回 true。 */ + public boolean strSetIfAbsent(String key, String value) { + return Boolean.TRUE.equals(redis.opsForValue().setIfAbsent(key, value)); + } + + /** 仅当 key 不存在时写入并带 TTL;成功返回 true。 */ + public boolean strSetIfAbsent(String key, String value, Duration ttl) { + return Boolean.TRUE.equals(redis.opsForValue().setIfAbsent(key, value, ttl)); + } + + /** 读取字符串;不存在返回 {@code null}。 */ + public String strGet(String key) { + return redis.opsForValue().get(key); + } + + /** 原子地读出旧值并写入新值。 */ + public String strGetAndSet(String key, String value) { + return redis.opsForValue().getAndSet(key, value); + } + + /** 将数字字符串自增 1;key 不存在时先按 0 再增。 */ + public Long strIncrement(String key) { + return redis.opsForValue().increment(key); + } + + /** 将数字字符串自增 {@code delta}。 */ + public Long strIncrement(String key, long delta) { + return redis.opsForValue().increment(key, delta); + } + + /** 将数字字符串自减 1。 */ + public Long strDecrement(String key) { + return redis.opsForValue().decrement(key); + } + + /** 将数字字符串自减 {@code delta}。 */ + public Long strDecrement(String key, long delta) { + return redis.opsForValue().decrement(key, delta); + } + + /** 设置位图中某一位;对应 Redis SETBIT。 */ + public Boolean strSetBit(String key, long offset, boolean value) { + return redis.opsForValue().setBit(key, offset, value); + } + + /** 读取位图中某一位;对应 Redis GETBIT。 */ + public Boolean strGetBit(String key, long offset) { + return redis.opsForValue().getBit(key, offset); + } + + /** + * 将对象序列化为 JSON 字符串后写入;序列化失败抛出 {@link IllegalStateException}。 + */ + public void setJson(String key, Object value) { + try { + strSet(key, objectMapper.writeValueAsString(value)); + } catch (JsonProcessingException e) { + throw new IllegalStateException("Redis JSON encode: " + key, e); + } + } + + /** + * 将对象序列化为 JSON 字符串后写入并带 TTL。 + * + * @throws IllegalStateException JSON 序列化失败 + */ + public void setJson(String key, Object value, Duration ttl) { + try { + strSet(key, objectMapper.writeValueAsString(value), ttl); + } catch (JsonProcessingException e) { + throw new IllegalStateException("Redis JSON encode: " + key, e); + } + } + + /** + * 读出 JSON 并反序列化为指定类型;key 不存在返回 {@code null}。 + * + * @throws IllegalStateException 反序列化失败 + */ + public T getJson(String key, Class type) { + String raw = strGet(key); + if (raw == null) { + return null; + } + try { + return objectMapper.readValue(raw, type); + } catch (JsonProcessingException e) { + throw new IllegalStateException("Redis JSON decode: " + key, e); + } + } + + /** + * 读出 JSON 并反序列化(支持泛型,如 {@code List});key 不存在返回 {@code null}。 + * + * @throws IllegalStateException 反序列化失败 + */ + public T getJson(String key, TypeReference typeRef) { + String raw = strGet(key); + if (raw == null) { + return null; + } + try { + return objectMapper.readValue(raw, typeRef); + } catch (JsonProcessingException e) { + throw new IllegalStateException("Redis JSON decode: " + key, e); + } + } + + // endregion + + // region Hash + + /** 哈希表设置单个 field。 */ + public void hashSet(String key, String field, String value) { + redis.opsForHash().put(key, field, value); + } + + /** 哈希表批量写入;{@code map} 为空则不做任何事。 */ + public void hashSetAll(String key, Map map) { + if (map == null || map.isEmpty()) { + return; + } + redis.opsForHash().putAll(key, map); + } + + /** 读取单个 field;不存在返回 {@code null}。 */ + public String hashGet(String key, String field) { + Object v = redis.opsForHash().get(key, field); + return v == null ? null : String.valueOf(v); + } + + /** + * 批量读 field,返回列表顺序与入参 {@code fields} 一致;某 field 不存在对应位置为 {@code null}。 + */ + public List hashMultiGet(String key, Collection fields) { + if (fields == null || fields.isEmpty()) { + return List.of(); + } + List raw = redis.opsForHash().multiGet(key, new ArrayList<>(fields)); + List out = new ArrayList<>(raw.size()); + for (Object o : raw) { + out.add(o == null ? null : String.valueOf(o)); + } + return out; + } + + /** 返回哈希表全部 field-value;空表返回空 Map(非 {@code null})。 */ + public Map hashGetAll(String key) { + Map entries = redis.opsForHash().entries(key); + if (entries.isEmpty()) { + return Collections.emptyMap(); + } + Map out = new LinkedHashMap<>(entries.size()); + entries.forEach((k, v) -> out.put(String.valueOf(k), v == null ? null : String.valueOf(v))); + return out; + } + + /** 删除一个或多个 field,返回实际删除个数。 */ + public Long hashDelete(String key, Object... fields) { + if (fields == null || fields.length == 0) { + return 0L; + } + return redis.opsForHash().delete(key, fields); + } + + /** field 是否存在。 */ + public Boolean hashHasKey(String key, String field) { + return redis.opsForHash().hasKey(key, field); + } + + /** 哈希表 field 个数。 */ + public Long hashSize(String key) { + return redis.opsForHash().size(key); + } + + /** 将 field 上数字字符串按 long 自增。 */ + public Long hashIncrement(String key, String field, long delta) { + return redis.opsForHash().increment(key, field, delta); + } + + /** 将 field 上数字按 double 自增(可存浮点计数)。 */ + public Double hashIncrement(String key, String field, double delta) { + return redis.opsForHash().increment(key, field, delta); + } + + /** 将对象 JSON 化后写入指定 field。 */ + public void hashSetJson(String key, String field, Object value) { + try { + hashSet(key, field, objectMapper.writeValueAsString(value)); + } catch (JsonProcessingException e) { + throw new IllegalStateException("Redis hash JSON encode: " + key + "#" + field, e); + } + } + + /** 读出 field 的 JSON 并反序列化;field 不存在返回 {@code null}。 */ + public T hashGetJson(String key, String field, Class type) { + String raw = hashGet(key, field); + if (raw == null) { + return null; + } + try { + return objectMapper.readValue(raw, type); + } catch (JsonProcessingException e) { + throw new IllegalStateException("Redis hash JSON decode: " + key + "#" + field, e); + } + } + + // endregion + + // region List + + /** 从列表左侧压入一个元素,返回列表当前长度。 */ + public Long listLeftPush(String key, String value) { + return redis.opsForList().leftPush(key, value); + } + + /** 从左侧一次压入多个元素。 */ + public Long listLeftPushAll(String key, String... values) { + if (values == null || values.length == 0) { + return 0L; + } + return redis.opsForList().leftPushAll(key, values); + } + + /** 从列表右侧压入一个元素。 */ + public Long listRightPush(String key, String value) { + return redis.opsForList().rightPush(key, value); + } + + /** 从右侧一次压入多个元素。 */ + public Long listRightPushAll(String key, String... values) { + if (values == null || values.length == 0) { + return 0L; + } + return redis.opsForList().rightPushAll(key, values); + } + + /** 非阻塞:从左侧弹出一个元素。 */ + public String listLeftPop(String key) { + return redis.opsForList().leftPop(key); + } + + /** 非阻塞:从右侧弹出一个元素。 */ + public String listRightPop(String key) { + return redis.opsForList().rightPop(key); + } + + /** + * 阻塞版左侧弹出:在 {@code timeout} 内等待直到有元素或超时;超时返回 {@code null}。 + */ + public String listLeftPop(String key, Duration timeout) { + return redis.opsForList().leftPop(key, timeout); + } + + /** + * 阻塞版右侧弹出。 + */ + public String listRightPop(String key, Duration timeout) { + return redis.opsForList().rightPop(key, timeout); + } + + /** + * 按闭区间下标取子列表;{@code end} 可为 -1 表示到表尾。 + */ + public List listRange(String key, long start, long end) { + return redis.opsForList().range(key, start, end); + } + + /** 列表长度。 */ + public Long listSize(String key) { + return redis.opsForList().size(key); + } + + /** 按下标取值;越界返回 {@code null}。 */ + public String listIndex(String key, long index) { + return redis.opsForList().index(key, index); + } + + /** 按下标覆盖元素。 */ + public void listSet(String key, long index, String value) { + redis.opsForList().set(key, index, value); + } + + /** 裁剪列表,只保留闭区间 {@code [start, end]} 内元素。 */ + public void listTrim(String key, long start, long end) { + redis.opsForList().trim(key, start, end); + } + + /** + * 删除与 {@code value} 相等的元素;{@code count > 0} 从左删 {@code count} 个,{@code count < 0} 从右删,{@code + * count = 0} 删除全部相等项。 + */ + public Long listRemove(String key, long count, String value) { + return redis.opsForList().remove(key, count, value); + } + + // endregion + + // region Set + + /** 向集合添加成员,返回新增个数(已存在的不计)。 */ + public Long setAdd(String key, String... members) { + if (members == null || members.length == 0) { + return 0L; + } + return redis.opsForSet().add(key, members); + } + + /** 从集合移除成员,返回实际移除个数。 */ + public Long setRemove(String key, Object... members) { + if (members == null || members.length == 0) { + return 0L; + } + return redis.opsForSet().remove(key, members); + } + + /** 返回集合全部成员;空集合返回空 Set(非 {@code null})。 */ + public Set setMembers(String key) { + Set m = redis.opsForSet().members(key); + return m == null ? Collections.emptySet() : m; + } + + /** 判断 member 是否在集合中。 */ + public Boolean setIsMember(String key, String member) { + return redis.opsForSet().isMember(key, member); + } + + /** 集合元素个数。 */ + public Long setSize(String key) { + return redis.opsForSet().size(key); + } + + /** 计算 {@code key} 与 {@code otherKey} 两个集合的交集。 */ + public Set setIntersect(String key, String otherKey) { + Set s = redis.opsForSet().intersect(key, List.of(otherKey)); + return s == null ? Collections.emptySet() : s; + } + + /** 计算两个集合的并集。 */ + public Set setUnion(String key, String otherKey) { + Set s = redis.opsForSet().union(key, List.of(otherKey)); + return s == null ? Collections.emptySet() : s; + } + + /** 计算两个集合的差集(存在于 key 且不存在于 otherKey)。 */ + public Set setDifference(String key, String otherKey) { + Set s = redis.opsForSet().difference(key, List.of(otherKey)); + return s == null ? Collections.emptySet() : s; + } + + // endregion + + // region Sorted set(ZSet) + + /** 添加成员及其分数;新增返回 true,仅更新分数可能返回 false(与 Redis 版本/实现有关)。 */ + public Boolean zSetAdd(String key, String member, double score) { + return redis.opsForZSet().add(key, member, score); + } + + /** 按成员删除,返回删除个数。 */ + public Long zSetRemove(String key, Object... members) { + if (members == null || members.length == 0) { + return 0L; + } + return redis.opsForZSet().remove(key, members); + } + + /** 将成员分数增加 {@code delta},返回新分数。 */ + public Double zSetIncrementScore(String key, String member, double delta) { + return redis.opsForZSet().incrementScore(key, member, delta); + } + + /** 有序集合成员个数(基数)。 */ + public Long zSetCard(String key) { + return redis.opsForZSet().zCard(key); + } + + /** 分数在闭区间 {@code [min, max]} 内的成员数量。 */ + public Long zSetCount(String key, double min, double max) { + return redis.opsForZSet().count(key, min, max); + } + + /** 查询成员分数;不存在返回 {@code null}。 */ + public Double zSetScore(String key, String member) { + return redis.opsForZSet().score(key, member); + } + + /** 按分数从低到高的排名(0 起);不存在返回 {@code null}。 */ + public Long zSetRank(String key, String member) { + return redis.opsForZSet().rank(key, member); + } + + /** 按分数从高到低的排名。 */ + public Long zSetReverseRank(String key, String member) { + return redis.opsForZSet().reverseRank(key, member); + } + + /** 按排名闭区间取成员(分数升序)。 */ + public Set zSetRange(String key, long start, long end) { + return redis.opsForZSet().range(key, start, end); + } + + /** 按排名闭区间取成员(分数降序)。 */ + public Set zSetReverseRange(String key, long start, long end) { + return redis.opsForZSet().reverseRange(key, start, end); + } + + /** 按分数闭区间 {@code [min, max]} 取成员。 */ + public Set zSetRangeByScore(String key, double min, double max) { + return redis.opsForZSet().rangeByScore(key, min, max); + } + + /** 按排名区间取成员并带上分数。 */ + public Set> zSetRangeWithScores(String key, long start, long end) { + Set> s = redis.opsForZSet().rangeWithScores(key, start, end); + return s == null ? Collections.emptySet() : s; + } + + /** 按排名删除闭区间内的成员,返回删除个数。 */ + public Long zSetRemoveRangeByRank(String key, long start, long end) { + return redis.opsForZSet().removeRange(key, start, end); + } + + /** 按分数闭区间删除成员(含边界)。 */ + public Long zSetRemoveRangeByScore(String key, double min, double max) { + return redis.opsForZSet().removeRangeByScore(key, min, max); + } + + // endregion + + // region HyperLogLog + + /** 向 HyperLogLog 添加元素,返回内部认为新增了多少(近似 0/1)。 */ + public Long hyperLogLogAdd(String key, String... elements) { + if (elements == null || elements.length == 0) { + return 0L; + } + return redis.opsForHyperLogLog().add(key, elements); + } + + /** 估算基数(去重后大约多少个不同元素)。 */ + public Long hyperLogLogSize(String key) { + return redis.opsForHyperLogLog().size(key); + } + + /** 将多个 HyperLogLog 合并到 {@code destination}。 */ + public void hyperLogLogUnion(String destination, String... sourceKeys) { + if (sourceKeys == null || sourceKeys.length == 0) { + return; + } + redis.opsForHyperLogLog().union(destination, sourceKeys); + } + + // endregion + + // region Key 与通用 + + /** 删除单个 key;不存在返回 false。 */ + public Boolean delete(String key) { + return redis.delete(key); + } + + /** 批量删除,返回成功删除的 key 数量。 */ + public Long delete(Collection keys) { + if (keys == null || keys.isEmpty()) { + return 0L; + } + return redis.delete(keys); + } + + /** key 是否存在。 */ + public Boolean hasKey(String key) { + return redis.hasKey(key); + } + + /** 设置存活时间;key 不存在返回 false。 */ + public Boolean expire(String key, Duration ttl) { + return redis.expire(key, ttl); + } + + /** 去掉 TTL,使 key 持久存在(若支持)。 */ + public Boolean persist(String key) { + return redis.persist(key); + } + + /** 剩余过期时间(秒),-1 表示无过期,-2 表示 key 不存在。 */ + public Long getExpire(String key) { + return redis.getExpire(key); + } + + /** 剩余过期时间,单位由 {@code unit} 指定。 */ + public Long getExpire(String key, TimeUnit unit) { + return redis.getExpire(key, unit); + } + + /** + * 使用 SCAN 迭代匹配 {@code pattern} 的 key(非阻塞);{@code count} 为单次提示扫描条数,非精确上限。 + * + *

适合生产环境替代 {@code KEYS}。 + */ + public List scanKeys(String pattern, long count) { + String p = Objects.requireNonNull(pattern, "pattern"); + ScanOptions options = ScanOptions.scanOptions().match(p).count(count).build(); + List keys = new ArrayList<>(); + try (Cursor cursor = redis.scan(options)) { + while (cursor.hasNext()) { + keys.add(cursor.next()); + } + } + return keys; + } + + /** + * 将 {@link ZSetOperations.TypedTuple} 集合转为 {@code {member, score}} 的 Map 列表,便于直接 JSON 输出。 + */ + public List> zSetTuplesToRows(Set> tuples) { + if (tuples == null || tuples.isEmpty()) { + return List.of(); + } + return tuples.stream() + .map(t -> { + Map row = new LinkedHashMap<>(2); + row.put("member", t.getValue()); + row.put("score", t.getScore()); + return row; + }) + .collect(Collectors.toList()); + } + + /** + * 单次请求批量读取多个 key 的字符串值;结果顺序与 {@code keys} 一致,不存在的 key 对应位置为 {@code null}。 + */ + public List strMultiGet(List keys) { + if (keys == null || keys.isEmpty()) { + return List.of(); + } + return redis.opsForValue().multiGet(keys); + } + + /** 批量写入多个 key-value,对应 Redis MSET。 */ + public void strMultiSet(Map map) { + if (map == null || map.isEmpty()) { + return; + } + redis.opsForValue().multiSet(map); + } + + /** + * 返回底层 {@link StringRedisTemplate},用于执行 Lua、自定义 {@link org.springframework.data.redis.core.script.RedisScript} + * 等本类未封装的能力。 + */ + public StringRedisTemplate template() { + return redis; + } + + // endregion +} diff --git a/ServerModule/src/main/java/com/huangzj/server/web/ClientTcpConfigController.java b/ServerModule/src/main/java/com/huangzj/server/web/ClientTcpConfigController.java new file mode 100644 index 0000000..e3dcc44 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/web/ClientTcpConfigController.java @@ -0,0 +1,25 @@ +package com.huangzj.server.web; + +import com.huangzj.server.config.ClientTcpProperties; +import java.util.LinkedHashMap; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** 给页面或脚本展示「客户端连区服」的 TCP 端口(帧格式:4 字节大端长度 + CmdRpcEnvelope)。 */ +@RestController +@RequestMapping("/api/config") +@RequiredArgsConstructor +public class ClientTcpConfigController { + + private final ClientTcpProperties clientTcpProperties; + + @GetMapping("/client-tcp") + public Map clientTcp() { + Map m = new LinkedHashMap<>(); + m.put("port", clientTcpProperties.getPort()); + return m; + } +} diff --git a/ServerModule/src/main/java/com/huangzj/server/web/DemoApiController.java b/ServerModule/src/main/java/com/huangzj/server/web/DemoApiController.java new file mode 100644 index 0000000..2451a68 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/web/DemoApiController.java @@ -0,0 +1,96 @@ +package com.huangzj.server.web; + +import com.huangzj.base.spring.module.PlayerModuleRegistry; +import com.huangzj.server.config.AppProperties; +import com.huangzj.server.event.AppDomainEvent; +import com.huangzj.server.event.DemoEventListener; +import com.huangzj.server.mongo.DemoMongoService; +import com.huangzj.server.mongo.DemoPayloadDoc; +import com.huangzj.server.redis.RedisUtil; +import java.util.LinkedHashMap; +import java.util.Map; +import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/demo") +@RequiredArgsConstructor +public class DemoApiController { + + private final DemoMongoService demoMongoService; + private final RedisUtil redisUtil; + private final ApplicationEventPublisher eventPublisher; + private final DemoEventListener demoEventListener; + private final PlayerModuleRegistry playerModuleRegistry; + private final AppProperties appProperties; + + @PostMapping("/mongo/save-immediate") + public DemoPayloadDoc mongoSaveImmediate(@RequestBody DemoPayloadDoc doc) { + return demoMongoService.saveImmediate(doc); + } + + @PostMapping("/mongo/save-scheduled") + public void mongoSaveScheduled(@RequestBody DemoPayloadDoc doc) { + demoMongoService.scheduleSave(doc); + } + + @GetMapping("/mongo/latest") + public DemoPayloadDoc mongoLatest(@RequestParam long playerId) { + return demoMongoService.findLatestByPlayer(playerId); + } + + @PostMapping("/redis/set") + public void redisSet(@RequestBody RedisKv body) { + redisUtil.strSet(body.key(), body.value()); + } + + @GetMapping("/redis/get") + public String redisGet(@RequestParam String key) { + return redisUtil.strGet(key); + } + + /** 发一个 {@link AppDomainEvent},Listener 里会累加计数。 */ + @PostMapping("/event/publish") + public void eventPublish(@RequestBody EventPubBody body) { + eventPublisher.publishEvent(new AppDomainEvent(this, body.topic(), body.body())); + } + + @GetMapping("/event/last") + public Map eventLast() { + Map m = new LinkedHashMap<>(); + m.put("count", demoEventListener.getReceiveCount()); + m.put("lastTopic", demoEventListener.getLastTopic()); + m.put("lastBody", demoEventListener.getLastBody()); + return m; + } + + @GetMapping("/module/info") + public Map moduleInfo() { + Map m = new LinkedHashMap<>(); + m.put("playerId", appProperties.getModule().getPlayerId()); + m.put("tickIntervalMs", appProperties.getModule().getTickIntervalMs()); + m.put("modules", playerModuleRegistry.describeModules()); + return m; + } + + @PostMapping("/module/tick") + public String moduleTick() { + playerModuleRegistry.runTickAll(System.currentTimeMillis()); + return "ok"; + } + + @PostMapping("/module/save") + public void moduleSave() { + playerModuleRegistry.saveAll(); + } + + public record RedisKv(String key, String value) {} + + public record EventPubBody(String topic, String body) {} +} diff --git a/ServerModule/src/main/java/com/huangzj/server/web/PingController.java b/ServerModule/src/main/java/com/huangzj/server/web/PingController.java new file mode 100644 index 0000000..bed1367 --- /dev/null +++ b/ServerModule/src/main/java/com/huangzj/server/web/PingController.java @@ -0,0 +1,18 @@ +package com.huangzj.server.web; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** 最小 HTTP 探活(原 {@code com.huangzj.comm.http} 合并至此)。 */ +@RestController +@RequestMapping("/api") +public class PingController { + + @GetMapping("/ping") + public PingPayload ping() { + return new PingPayload(true, System.currentTimeMillis()); + } + + public record PingPayload(boolean ok, long serverTimeMs) {} +} diff --git a/ServerModule/src/main/resources/application-dev.yml b/ServerModule/src/main/resources/application-dev.yml new file mode 100644 index 0000000..79af0b4 --- /dev/null +++ b/ServerModule/src/main/resources/application-dev.yml @@ -0,0 +1,30 @@ +# 开发环境:本机 Mongo / Redis / 跨服,日志落项目相对目录 +server: + port: 8080 + +spring: + data: + mongodb: + uri: mongodb:// + redis: + host: + port: 6379 + password: + username: + +game: + client-tcp: + port: 9091 + +cross: + host: 127.0.0.1 + port: 9200 + server-id: zone-1 + token: "" + heartbeat-interval-ms: 15000 + +app: + logging: + dir: logs/ServerModule + mongo: + collection: test diff --git a/ServerModule/src/main/resources/application-prod.yml b/ServerModule/src/main/resources/application-prod.yml new file mode 100644 index 0000000..b47d2e3 --- /dev/null +++ b/ServerModule/src/main/resources/application-prod.yml @@ -0,0 +1,28 @@ +# 部署环境(生产/预发):请通过环境变量注入连接信息与密钥,勿把真实密码写进仓库 +server: + port: ${SERVER_HTTP_PORT:8080} + +spring: + data: + mongodb: + uri: ${MONGODB_URI:mongodb://127.0.0.1:27017/demo_comm} + redis: + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + password: ${REDIS_PASSWORD:} + username: ${REDIS_USERNAME:} + +game: + client-tcp: + port: ${GAME_CLIENT_TCP_PORT:9091} + +cross: + host: ${CROSS_HOST:127.0.0.1} + port: ${CROSS_TCP_PORT:9200} + server-id: ${ZONE_SERVER_ID:zone-1} + token: ${CROSS_LINK_TOKEN:} + heartbeat-interval-ms: ${CROSS_HEARTBEAT_INTERVAL_MS:15000} + +app: + logging: + dir: ${APP_LOG_DIR:/var/log/comm-framework/server} diff --git a/ServerModule/src/main/resources/application.yml b/ServerModule/src/main/resources/application.yml new file mode 100644 index 0000000..8ac37b5 --- /dev/null +++ b/ServerModule/src/main/resources/application.yml @@ -0,0 +1,17 @@ +# 公共入口:按 spring.profiles.active 叠加 application-{profile}.yml +# 开发默认:未设置环境变量 SPRING_PROFILES_ACTIVE 时使用 dev +spring: + application: + name: server-module + profiles: + active: ${SPRING_PROFILES_ACTIVE:dev} +# 与运行环境无关的业务默认(可被各 profile 覆盖) +app: + mongo: + collection: demo_payload + save: + interval-ms: 15000 + module: + player-id: 900001 + tick-interval-ms: 8000 + diff --git a/ServerModule/src/main/resources/logback-spring.xml b/ServerModule/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..56f661e --- /dev/null +++ b/ServerModule/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + ${LOG_DIR}/info.log + + ${FILE_LOG_PATTERN} + UTF-8 + + + INFO + + + ERROR + DENY + NEUTRAL + + + ${LOG_DIR}/info.%d{yyyy-MM-dd}.%i.log.gz + 10MB + 14 + 512MB + + + + + + ${LOG_DIR}/error.log + + ${FILE_LOG_PATTERN} + UTF-8 + + + ERROR + ACCEPT + DENY + + + ${LOG_DIR}/error.%d{yyyy-MM-dd}.%i.log.gz + 10MB + 30 + 512MB + + + + + + + + + + diff --git a/ServerModule/src/main/resources/static/index.html b/ServerModule/src/main/resources/static/index.html new file mode 100644 index 0000000..25d9c19 --- /dev/null +++ b/ServerModule/src/main/resources/static/index.html @@ -0,0 +1,174 @@ + + + + + + 通信探测 + + + +

业务 TCP(4 字节大端长度 + CmdRpcEnvelope)端口:。 + 三条路径示例请运行 com.huangzj.server.demo.TcpPathsDemo(需先起 CrossModule 再起 ServerModule)。

+ + + + + + + + + + + +

+
+  
+
+
diff --git a/ServerModule/target/classes/application-dev.yml b/ServerModule/target/classes/application-dev.yml
new file mode 100644
index 0000000..d21140d
--- /dev/null
+++ b/ServerModule/target/classes/application-dev.yml
@@ -0,0 +1,30 @@
+# 开发环境:本机 Mongo / Redis / 跨服,日志落项目相对目录
+server:
+  port: 8080
+
+spring:
+  data:
+    mongodb:
+      uri: mongodb://huangzj:huangzj@43.155.238.153:27017/test?authSource=admin
+    redis:
+      host: 43.155.238.153
+      port: 6379
+      password: huangzj
+      username: default
+
+game:
+  client-tcp:
+    port: 9091
+
+cross:
+  host: 127.0.0.1
+  port: 9200
+  server-id: zone-1
+  token: ""
+  heartbeat-interval-ms: 15000
+
+app:
+  logging:
+    dir: logs/ServerModule
+  mongo:
+    collection: test
diff --git a/ServerModule/target/classes/application-prod.yml b/ServerModule/target/classes/application-prod.yml
new file mode 100644
index 0000000..b47d2e3
--- /dev/null
+++ b/ServerModule/target/classes/application-prod.yml
@@ -0,0 +1,28 @@
+# 部署环境(生产/预发):请通过环境变量注入连接信息与密钥,勿把真实密码写进仓库
+server:
+  port: ${SERVER_HTTP_PORT:8080}
+
+spring:
+  data:
+    mongodb:
+      uri: ${MONGODB_URI:mongodb://127.0.0.1:27017/demo_comm}
+    redis:
+      host: ${REDIS_HOST:127.0.0.1}
+      port: ${REDIS_PORT:6379}
+      password: ${REDIS_PASSWORD:}
+      username: ${REDIS_USERNAME:}
+
+game:
+  client-tcp:
+    port: ${GAME_CLIENT_TCP_PORT:9091}
+
+cross:
+  host: ${CROSS_HOST:127.0.0.1}
+  port: ${CROSS_TCP_PORT:9200}
+  server-id: ${ZONE_SERVER_ID:zone-1}
+  token: ${CROSS_LINK_TOKEN:}
+  heartbeat-interval-ms: ${CROSS_HEARTBEAT_INTERVAL_MS:15000}
+
+app:
+  logging:
+    dir: ${APP_LOG_DIR:/var/log/comm-framework/server}
diff --git a/ServerModule/target/classes/application.yml b/ServerModule/target/classes/application.yml
new file mode 100644
index 0000000..8ac37b5
--- /dev/null
+++ b/ServerModule/target/classes/application.yml
@@ -0,0 +1,17 @@
+# 公共入口:按 spring.profiles.active 叠加 application-{profile}.yml
+# 开发默认:未设置环境变量 SPRING_PROFILES_ACTIVE 时使用 dev
+spring:
+  application:
+    name: server-module
+  profiles:
+    active: ${SPRING_PROFILES_ACTIVE:dev}
+# 与运行环境无关的业务默认(可被各 profile 覆盖)
+app:
+  mongo:
+    collection: demo_payload
+  save:
+    interval-ms: 15000
+  module:
+    player-id: 900001
+    tick-interval-ms: 8000
+
diff --git a/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossLinkProperties.class b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossLinkProperties.class
new file mode 100644
index 0000000..e21ab1d
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossLinkProperties.class differ
diff --git a/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossServerInboundHandler.class b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossServerInboundHandler.class
new file mode 100644
index 0000000..4d1b32c
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossServerInboundHandler.class differ
diff --git a/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpClient$1.class b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpClient$1.class
new file mode 100644
index 0000000..1a45f0f
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpClient$1.class differ
diff --git a/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpClient.class b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpClient.class
new file mode 100644
index 0000000..3c64ca7
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpClient.class differ
diff --git a/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpHeartbeatTask.class b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpHeartbeatTask.class
new file mode 100644
index 0000000..f29d5a9
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/comm/crosslink/CrossTcpHeartbeatTask.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/ServerModuleApplication.class b/ServerModule/target/classes/com/huangzj/server/ServerModuleApplication.class
new file mode 100644
index 0000000..9a53694
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/ServerModuleApplication.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/cmd/ServerCommandRegistry.class b/ServerModule/target/classes/com/huangzj/server/cmd/ServerCommandRegistry.class
new file mode 100644
index 0000000..40da7ff
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/cmd/ServerCommandRegistry.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath1LocalEchoCommand.class b/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath1LocalEchoCommand.class
new file mode 100644
index 0000000..5450a9a
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath1LocalEchoCommand.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath2CrossThenServerCommand.class b/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath2CrossThenServerCommand.class
new file mode 100644
index 0000000..918c005
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath2CrossThenServerCommand.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath3CrossRelayCommand.class b/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath3CrossRelayCommand.class
new file mode 100644
index 0000000..19923e5
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/cmd/cmds/TcpPath3CrossRelayCommand.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Module.class b/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Module.class
new file mode 100644
index 0000000..caba808
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Module.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Mongo.class b/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Mongo.class
new file mode 100644
index 0000000..31ffcb2
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Mongo.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Save.class b/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Save.class
new file mode 100644
index 0000000..dce386a
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/config/AppProperties$Save.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/config/AppProperties.class b/ServerModule/target/classes/com/huangzj/server/config/AppProperties.class
new file mode 100644
index 0000000..78065d5
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/config/AppProperties.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/config/ClientTcpProperties.class b/ServerModule/target/classes/com/huangzj/server/config/ClientTcpProperties.class
new file mode 100644
index 0000000..5b94c76
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/config/ClientTcpProperties.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/demo/TcpPathsDemo.class b/ServerModule/target/classes/com/huangzj/server/demo/TcpPathsDemo.class
new file mode 100644
index 0000000..f823089
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/demo/TcpPathsDemo.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/event/AppDomainEvent.class b/ServerModule/target/classes/com/huangzj/server/event/AppDomainEvent.class
new file mode 100644
index 0000000..d8cb250
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/event/AppDomainEvent.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/event/DemoEventListener.class b/ServerModule/target/classes/com/huangzj/server/event/DemoEventListener.class
new file mode 100644
index 0000000..b87f71c
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/event/DemoEventListener.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/module/DemoAuxModule.class b/ServerModule/target/classes/com/huangzj/server/module/DemoAuxModule.class
new file mode 100644
index 0000000..df02549
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/module/DemoAuxModule.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/module/DemoPlayerHost.class b/ServerModule/target/classes/com/huangzj/server/module/DemoPlayerHost.class
new file mode 100644
index 0000000..076cf2b
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/module/DemoPlayerHost.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/module/DemoPlayerHostBean.class b/ServerModule/target/classes/com/huangzj/server/module/DemoPlayerHostBean.class
new file mode 100644
index 0000000..76fad06
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/module/DemoPlayerHostBean.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/module/ModuleTickScheduler.class b/ServerModule/target/classes/com/huangzj/server/module/ModuleTickScheduler.class
new file mode 100644
index 0000000..855be51
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/module/ModuleTickScheduler.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/module/SamplePlayerModule.class b/ServerModule/target/classes/com/huangzj/server/module/SamplePlayerModule.class
new file mode 100644
index 0000000..dc86809
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/module/SamplePlayerModule.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/mongo/DemoMongoService.class b/ServerModule/target/classes/com/huangzj/server/mongo/DemoMongoService.class
new file mode 100644
index 0000000..9024acc
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/mongo/DemoMongoService.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/mongo/DemoPayloadDoc.class b/ServerModule/target/classes/com/huangzj/server/mongo/DemoPayloadDoc.class
new file mode 100644
index 0000000..d243fc6
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/mongo/DemoPayloadDoc.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/net/ClientTcpChannelInitializer.class b/ServerModule/target/classes/com/huangzj/server/net/ClientTcpChannelInitializer.class
new file mode 100644
index 0000000..4b71755
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/net/ClientTcpChannelInitializer.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/net/ClientTcpServer.class b/ServerModule/target/classes/com/huangzj/server/net/ClientTcpServer.class
new file mode 100644
index 0000000..280a91c
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/net/ClientTcpServer.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/redis/RedisUtil.class b/ServerModule/target/classes/com/huangzj/server/redis/RedisUtil.class
new file mode 100644
index 0000000..17cce4c
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/redis/RedisUtil.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/web/ClientTcpConfigController.class b/ServerModule/target/classes/com/huangzj/server/web/ClientTcpConfigController.class
new file mode 100644
index 0000000..5c3d5f2
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/web/ClientTcpConfigController.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/web/DemoApiController$EventPubBody.class b/ServerModule/target/classes/com/huangzj/server/web/DemoApiController$EventPubBody.class
new file mode 100644
index 0000000..f0cf4a1
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/web/DemoApiController$EventPubBody.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/web/DemoApiController$RedisKv.class b/ServerModule/target/classes/com/huangzj/server/web/DemoApiController$RedisKv.class
new file mode 100644
index 0000000..d251b81
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/web/DemoApiController$RedisKv.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/web/DemoApiController.class b/ServerModule/target/classes/com/huangzj/server/web/DemoApiController.class
new file mode 100644
index 0000000..4ab6c6e
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/web/DemoApiController.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/web/PingController$PingPayload.class b/ServerModule/target/classes/com/huangzj/server/web/PingController$PingPayload.class
new file mode 100644
index 0000000..c55739e
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/web/PingController$PingPayload.class differ
diff --git a/ServerModule/target/classes/com/huangzj/server/web/PingController.class b/ServerModule/target/classes/com/huangzj/server/web/PingController.class
new file mode 100644
index 0000000..c0d9429
Binary files /dev/null and b/ServerModule/target/classes/com/huangzj/server/web/PingController.class differ
diff --git a/ServerModule/target/classes/logback-spring.xml b/ServerModule/target/classes/logback-spring.xml
new file mode 100644
index 0000000..56f661e
--- /dev/null
+++ b/ServerModule/target/classes/logback-spring.xml
@@ -0,0 +1,58 @@
+
+
+    
+    
+
+    
+    
+
+    
+    
+        ${LOG_DIR}/info.log
+        
+            ${FILE_LOG_PATTERN}
+            UTF-8
+        
+        
+            INFO
+        
+        
+            ERROR
+            DENY
+            NEUTRAL
+        
+        
+            ${LOG_DIR}/info.%d{yyyy-MM-dd}.%i.log.gz
+            10MB
+            14
+            512MB
+        
+    
+
+    
+    
+        ${LOG_DIR}/error.log
+        
+            ${FILE_LOG_PATTERN}
+            UTF-8
+        
+        
+            ERROR
+            ACCEPT
+            DENY
+        
+        
+            ${LOG_DIR}/error.%d{yyyy-MM-dd}.%i.log.gz
+            10MB
+            30
+            512MB
+        
+    
+
+    
+    
+        
+        
+        
+    
+
diff --git a/ServerModule/target/classes/static/index.html b/ServerModule/target/classes/static/index.html
new file mode 100644
index 0000000..25d9c19
--- /dev/null
+++ b/ServerModule/target/classes/static/index.html
@@ -0,0 +1,174 @@
+
+
+
+  
+  
+  通信探测
+  
+
+
+  

业务 TCP(4 字节大端长度 + CmdRpcEnvelope)端口:。 + 三条路径示例请运行 com.huangzj.server.demo.TcpPathsDemo(需先起 CrossModule 再起 ServerModule)。

+ + + + + + + + + + + +

+
+  
+
+
diff --git a/ServerModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/ServerModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..9545188
--- /dev/null
+++ b/ServerModule/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,44 @@
+com\huangzj\server\config\AppProperties$Mongo.class
+com\huangzj\server\cmd\ZoneCommandRegistry.class
+com\huangzj\server\mongo\DemoPayloadDoc.class
+com\huangzj\server\module\SamplePlayerModule.class
+com\huangzj\server\event\DemoEventListener.class
+com\huangzj\server\web\DemoApiController$EventBody.class
+com\huangzj\server\ServerModuleApplication.class
+com\huangzj\server\web\DemoApiController$RedisKv.class
+com\huangzj\comm\crosslink\CrossClientInboundHandler.class
+com\huangzj\server\cmd\cmds\CrossProxyPbCommand.class
+com\huangzj\comm\model\HttpPingPayload.class
+com\huangzj\comm\codec\BinaryFrameCodec.class
+com\huangzj\server\config\WsFrontendConfigController.class
+com\huangzj\server\module\DemoAuxModule.class
+com\huangzj\comm\ws\CommNettyWebSocketServer$1.class
+com\huangzj\server\module\ModuleTickScheduler.class
+com\huangzj\comm\ws\EchoBinaryCommandRouter.class
+com\huangzj\server\web\DemoApiController.class
+com\huangzj\comm\crosslink\CrossTcpClient.class
+com\huangzj\server\config\AppProperties$Save.class
+com\huangzj\server\module\DemoPlayerHostBean.class
+com\huangzj\comm\ws\ProtobufWebSocketChannelHandler.class
+com\huangzj\comm\ws\BinaryCommandRouter.class
+com\huangzj\comm\crosslink\CrossTestController.class
+com\huangzj\server\config\AppProperties$Module.class
+com\huangzj\comm\model\CommandId.class
+com\huangzj\server\config\CmdWebSocketProperties.class
+com\huangzj\server\redis\DemoRedisService.class
+com\huangzj\comm\model\DecodedBinaryEnvelope.class
+com\huangzj\comm\ws\CommNettyWebSocketServer.class
+com\huangzj\comm\config\CommWebSocketProperties.class
+com\huangzj\server\module\DemoPlayerHost.class
+com\huangzj\server\ws\cmd\CmdNettyWebSocketServer.class
+com\huangzj\comm\http\CommHttpController.class
+com\huangzj\server\ws\cmd\CmdNettyWebSocketServer$1.class
+com\huangzj\comm\crosslink\CrossTcpClient$1.class
+com\huangzj\comm\crosslink\CrossTestResponse.class
+com\huangzj\server\event\AppDomainEvent.class
+com\huangzj\server\config\AppProperties.class
+com\huangzj\server\ws\cmd\CmdWebSocketHandler.class
+com\huangzj\comm\crosslink\CrossLinkProperties.class
+com\huangzj\server\cmd\cmds\EchoWsPbCommand.class
+com\huangzj\server\cmd\cmds\CrossToGameEchoPbCommand.class
+com\huangzj\server\mongo\DemoMongoService.class
diff --git a/ServerModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/ServerModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..6c4222b
--- /dev/null
+++ b/ServerModule/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,36 @@
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\model\DecodedBinaryEnvelope.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\model\CommandId.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\module\DemoPlayerHostBean.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\codec\BinaryFrameCodec.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\event\DemoEventListener.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\module\ModuleTickScheduler.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\mongo\DemoPayloadDoc.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\crosslink\CrossTestResponse.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\ws\EchoBinaryCommandRouter.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\event\AppDomainEvent.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\config\CommWebSocketProperties.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\ws\BinaryCommandRouter.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\cmd\cmds\EchoWsPbCommand.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\config\AppProperties.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\module\SamplePlayerModule.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\module\DemoPlayerHost.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\crosslink\CrossClientInboundHandler.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\ws\ProtobufWebSocketChannelHandler.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\redis\DemoRedisService.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\ws\cmd\CmdWebSocketHandler.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\mongo\DemoMongoService.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\cmd\cmds\CrossToGameEchoPbCommand.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\cmd\cmds\CrossProxyPbCommand.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\model\HttpPingPayload.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\ServerModuleApplication.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\crosslink\CrossLinkProperties.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\config\CmdWebSocketProperties.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\web\DemoApiController.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\config\WsFrontendConfigController.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\cmd\ZoneCommandRegistry.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\module\DemoAuxModule.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\ws\CommNettyWebSocketServer.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\crosslink\CrossTcpClient.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\crosslink\CrossTestController.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\server\ws\cmd\CmdNettyWebSocketServer.java
+F:\coding\comm-framework\ServerModule\src\main\java\com\huangzj\comm\http\CommHttpController.java
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..f7c9009
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,48 @@
+
+
+    4.0.0
+
+    
+        org.springframework.boot
+        spring-boot-starter-parent
+        3.2.5
+        
+    
+
+    huangzj
+    comm-framework
+    0.0.1-SNAPSHOT
+    pom
+    comm-framework
+
+    
+        ProtoBufModule
+        BaseModule
+        CrossModule
+        ServerModule
+    
+
+    
+        
+            aliyun-public
+            https://maven.aliyun.com/repository/public
+            true
+            true
+        
+    
+    
+        
+            aliyun-public
+            https://maven.aliyun.com/repository/public
+            true
+            true
+        
+    
+
+    
+        17
+        3.25.3
+    
+