2个版本

使用旧的Rust 2015

0.1.1 2015年11月15日
0.1.0 2015年11月2日

#33 in #msgpack

GPL-3.0 许可证

41KB
675

MsgPackNet - 基于MessagePack消息的网络层

Build Status Coverage Status Latest Version

此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