6个版本
使用旧Rust 2015
0.3.2 | 2018年8月16日 |
---|---|
0.3.1 | 2018年8月13日 |
0.2.1 | 2018年7月30日 |
0.1.0 | 2018年7月24日 |
#27 在 #msg
28 每月下载量
26KB
372 行
msg-transmitter
概述
这是一个单服务器多客户端模型的库。该库的主要目的是帮助用户更专注于通信逻辑,而不是低级网络设计。用户可以在服务器和客户端之间传输任何结构体。
用户可以选择基于TCP或uds的连接。请注意,基于TCP的连接可以支持Windows和*nux,而基于uds的连接只能支持*nux。
依赖项
使用方法
要使用msg-transmitter
,将以下内容添加到您的Cargo.toml
[dependencies]
msg-transmitter = "0.3"
示例
一个基本的u32传输示例
extern crate tokio;
extern crate msg_transmitter;
use msg_transmitter::*;
use std::env;
fn main() {
let a = env::args().skip(1).collect::<Vec<_>>();
match a.first().unwrap().as_str() {
"client" => client(),
"server" => server(),
_ => panic!("failed"),
};
}
fn server() {
let server = create_tcp_server("127.0.0.1:6666", "server");
let server_task = server.start_server(0, |client_name, msg| {
println!("{}: {}", client_name, msg);
vec![(client_name, msg + 1)]
});
tokio::run(server_task);
}
fn client() {
let client = create_tcp_client("127.0.0.1:6666", "client");
let client_task = client.start_client(|msg: u32| {
println!("{}", msg);
if msg < 20 {
vec![msg + 1]
} else {
std::process::exit(0);
}
});
tokio::run(client_task);
}
更多示例可以在这里找到。
设计
对于服务器,当调用start_server时,它将开始绑定并监听目标端口,并为每个套接字启动两个tokio风格的任务。一个任务用于从套接字接收消息并处理用户的逻辑,另一个任务用于向套接字发送消息。在第一个任务处理完用户的逻辑后,它将通过mpsc::channel将消息发送给另一个任务。
对于客户端,当调用start_client时,它将开始连接目标端口并创建套接字,发送注册信息(由String表示的名称),并为每个套接字启动两个tokio风格的任务。这两个任务以与服务器任务相同的方式协同工作。目前,所有我们的网络都是基于TCP的。所有用户数据都通过简单的协议转换为字节。
+++++++++++++++++++++++++++++++++++++++++++++++
Data_size(4 bytes) | State(1 byte) | Data
+++++++++++++++++++++++++++++++++++++++++++++++
数据大小是一个4字节的头部,用于表示状态和数据字节数。因此,每个流无法传输包含超过2^32字节数据的消息。
状态表示此流的当前状态,目前只有两个状态。当状态等于0时,数据是注册信息;当状态等于1时,数据是用户的消息。
依赖项
~7MB
~121K SLoC