Skip to main content

自定义对外服协议

介绍

ExternalMessage 是用户与服务器交互的默认统一协议。 用户(游戏客户端)在发起请求时,默认情况下是通过 ExternalMessage 来进行交互的。 如果没有特殊情况,建议使用框架默认提供的 ExternalMessage。 因为没有使用到的字段 Protocol Buffer 会压缩数据,字节用多少占多少。

ExternalMessage 是框架提供的一种与外部交互的统一协议,也是默认推荐的方式。 注意,这里说的是默认推荐方式,并不是唯一方式,开发者可以自定义这部分内容的。 也就是说,可以不使用 ExternalMessage 与外部联系,而是使用一种自定义的统一协议。

比如你正打算开发一个物联网相关的、或者说其他的项目。想简化对外的统一协议,协议内容只需要路由与业务对象。 我们可以使用下面的 MyExternalMessage 来代替默认的 ExternalMessage,以满足项目的特殊需要。

syntax = "proto3";
package com.your.message;

message MyExternalMessage {
int32 cmd_merge = 1;
bytes data = 2;
}

如何扩展

  • code 4~9: MyExternalMessage,自定义统一协议。
  • code 11~21: MyCommunicationMessageCodec,自定义统一协议的编码码。
@Getter
@Setter
@ProtobufClass
public final class MyExternalMessage extends AbstractCommunicationMessage {
@Protobuf(fieldType = FieldType.INT32, order = 1)
int cmdMerge;
@Protobuf(fieldType = FieldType.BYTES, order = 2)
byte[] data;
}

public final class MyCommunicationMessageCodec implements CommunicationMessageCodec {
@Override
public CommunicationMessage createCommunicationMessage() {
return new MyExternalMessage();
}

@Override
public CommunicationMessage decode(byte[] bytes) {
return DataCodecKit.decode(bytes, MyExternalMessage.class);
}
}

设置

class OneApplication {
static void main() {
CommunicationMessageKit.communicationMessageCodec = new MyCommunicationMessageCodec();
...
new RunOne()
...
.startup();
}
}