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