2个版本
使用旧的Rust 2015
0.1.1 | 2015年11月15日 |
---|---|
0.1.0 | 2015年11月2日 |
#33 in #msgpack
41KB
675 行
MsgPackNet - 基于MessagePack消息的网络层
此crate提供了一个在TCP之上的抽象层,它使用MessagePack编码的消息而不是纯字节流。它还抽象地址和连接,并使用节点标识符来区分和寻址节点。
lib.rs
:
基于MessagePack消息的网络层。
此crate提供了一个在TCP之上的抽象层,它使用MessagePack编码的消息而不是纯字节流。它还抽象地址和连接,并使用节点标识符来区分和寻址节点。
此crate的主结构是Node
,它可以是参数化的。
-
Message
- 使用此crate的节点通过符合Message
特质的消息进行通信。这些消息使用serde
序列化为高效的MessagePack格式。 -
NodeId
- 此crate根据节点的NodeId
来识别和区分节点。所有通信节点应具有不同的id。因此,节点id应该是唯一的。这可以通过使用主监听套接字的IP地址和端口号来实现。或者,可以使用一个大的随机数(128位应该足以期望唯一性)。 -
InitMessage
- 在所有连接上交换的第一个消息使用InitMessage
特质而不是Message
。
底层协议
在建立新的连接(无论是传入还是传出)时,首先将一个InitMessage
发送到远程节点,同时发送本地NodeId
,然后从该节点读取初始化消息和远程NodeId
。在检查初始化消息后,连接要么被拒绝并关闭,要么被接受并添加到连接注册表中。
建立后,可以使用连接发送多个Message
类型的消息。
在空闲一段时间后或通过丢弃其CloseGuard
来关闭节点时,连接将被关闭。
示例
要使用此crate,首先需要创建一个带有节点id和初始化消息的Node
,这些消息作为第一条消息发送到其他节点。
use msgpacknet::*;
let node = Node::<String, (u64, u64)>::create_default();
然后,可以打开套接字以监听和接受连接。可以使用方法 node.listen_defaults()
在 IPv4 和 IPv6 的空闲端口上进行监听。
node.listen_defaults().expect("Failed to bind");
可以使用 node.addresses()
获取实际的地址。
println!("Addresses: {:?}", node.addresses());
let addr = node.addresses()[0];
可以通过 connect(...)
建立与其他节点的连接。调用结果为远程端节点的节点 ID。
let peer_id = node.connect(addr).expect("Failed to connect");
然后,可以通过 send(...)
发送消息...
let msg = "Hello world".to_owned();
node.send(&peer_id, &msg).expect("Failed to send");
...并通过 receive()
接收消息。
let event = node.receive();
依赖项
~1.6–2.3MB
~40K SLoC