ProtoWeaver

一个用于创建在内部 Netty 服务器上运行的自定义协议的网络库。

资源图片
[![Maintenance](https://img.shields.io/badge/Maintained%3F-yes-green.svg)](https://GitHub.com/Naereen/StrapDown.js/graphs/commit-activity) [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/G2G4DZF4D) # ProtoWeaver 一个用于创建自定义协议的Minecraft网络库,这些协议在内部netty服务器上运行。 #### 啥意思? 厌倦了劫持客户端连接来发送数据到和从代理?我当然厌倦了。ProtoWeaver允许您创建一个自定义协议,它在Minecraft服务器使用的同一端口上运行。 这意味着,无论玩家是否在线,代理(如Velocity)都能够与服务器通信,而无需在不同的端口上运行额外的套接字服务器。ProtoWeaver也并不 仅限于代理。使用`client`模块,任何第三方Java应用程序都可以直接与ProtoWeaver通信! ProtoWeaver速度快,安全且易于使用。所有协议都运行在Minecraft使用的同一netty实例下,使用ssl进行加密,并且被封装在一个非常直接的api中。让我们来看看: ### 功能 - [x] 无需任何用户配置 - [x] SSL加密 - [x] 协议认证 - [x] 数据包作为POJO - [x] 压缩(Gzip、Snappy、LZ) - [x] 所有主要的模组加载器(neoforge soon tm) - [ ] 用于注册原始协议的API(http、ssh等) - [x] 自定义序列化 - [ ] 自定义SSL提供程序/证书 - [ ] 多协议连接 - [ ] 告诉我你想看到什么! ### 项目设置 在您的build.gradle中包含 *** 注意:**不要对protoweaver进行混淆!它不能正常工作。ProtoWeaver是与你的模组/插件一起安装的!** ``` gradle repositories { maven { url "https://maven.mrnavastar.me/releases" } } dependencies { // 'common'可以替换为以下任何一个:`client`、`fabric`、`forge`、`paper`或`proxy`。 implementation "me.mrnavastar.protoweaver:common:1.3.11" } ``` ### 创建协议 协议可以通过许多内置功能进行高度自定义。这里是一个协议示例: ```java Protocol protocol = Protocol.create("my_mod_id", "cool_protocol") .setCompression(CompressionType.GZIP) .setServerHandler(MyCustomServerHandler.class) .setClientHandler(MyCustomClientHandler.class) .setMaxConnections(15) .addPacket(String.class) .build(); // 在协议可以被使用之前,加载它 ProtoWeaver.load(protocol); ``` ### 发送数据包 发送数据包非常简单。任何已经添加到协议中的POJO都是可以发送的有效数据包。(参见 [创建协议](#creating-a-protocol)) 注意到所有POJO序列化都通过[kyro](https://github.com/EsotericSoftware/kryo)进行处理,这是一个快速且快速的序列化库。 ```java // 如果你有一个'ProtoConnection'的引用,你可以简单地: connection.send(myObject); // 如果你有一个'ProtoClient'的引用,你也可以: client.send(myObject); ``` ### 处理数据包 所有协议都需要处理程序来执行功能。客户端和服务端可以使用相同的处理程序,也可以都使用不同的处理程序。 ```java public class MyCustomServerHandler implements ProtoConnectionHandler { // 注意:所有函数都可选 @Override public void onReady(ProtoConnection connection) { System.out.println("太棒了!看起来一个新的客户端连接了,来自: " + connection.getRemoteAddress()); } @Override public void onDisconnect(ProtoConnection connection) { System.out.println("再见: " + connection.getRemoteAddress()); } @Override public void handlePacket(ProtoConnection connection, Object packet) { System.out.println("哇!接收到: " + packet.toString() + " 来自: " + connection.getRemoteAddress()); } } ``` ```java public class MyCustomClientHandler implements ProtoConnectionHandler { // 注意:所有函数都可选 @Override public void onReady(ProtoConnection connection) { System.out.println("太棒了!连接到: " + connection.getRemoteAddress()); } @Override public void onDisconnect(ProtoConnection connection) { System.out.println("再见: " + connection.getRemoteAddress()); } @Override public void handlePacket(ProtoConnection connection, Object packet) { System.out.println("打招呼!"); connection.send("Hey server!"); } } ``` ### 自定义序列化 有时,可以在协议中发送Minecraft对象或其他预制POJO时很有用。为了实现这一点,你可以注册一个自定义序列化器。 例如,这是一个NBT标签的序列化器: ```java public class NbtSerializer extends ProtoSerializer { public NbtSerializer(Class type) { super(type); } @Override public void write(ByteArrayOutputStream buffer, CompoundTag value) { try { NbtIo.writeCompressed(value, buffer); } catch (IOException e) { Platform.throwException(e); } } @Override public CompoundTag read(ByteArrayInputStream buffer) { try { return NbtIo.readCompressed(buffer, NbtAccounter.unlimitedHeap()); } catch (IOException e) { Platform.throwException(e); throw new RuntimeException(e); } } } ``` 然后要注册序列化器,只需执行以下操作: ```java Protocol protocol = Protocol.create("my_mod_id", "cool_protocol") .setCompression(CompressionType.GZIP) .setServerHandler(MyCustomServerHandler.class) .setClientHandler(MyCustomClientHandler.class) .setMaxConnections(15) .addPacket(CompoundTag.class, NbtSerializer.class) .build(); ``` ### 更多文档即将推出!也许一个真正的网站??