[](https://GitHub.com/Naereen/StrapDown.js/graphs/commit-activity)
[](http://makeapullrequest.com)
[](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();
```
### 更多文档即将推出!也许一个真正的网站??