#user #model #communication #design #msg #focus #low-level

msg-transmitter

基于TCP的单服务器多客户端模型,使用Rust编程语言编写

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 每月下载量

MIT 协议

26KB
372

msg-transmitter

Build Status Crates.io Documentation

API文档

概述

这是一个单服务器多客户端模型的库。该库的主要目的是帮助用户更专注于通信逻辑,而不是低级网络设计。用户可以在服务器和客户端之间传输任何结构体。

用户可以选择基于TCP或uds的连接。请注意,基于TCP的连接可以支持Windows和*nux,而基于uds的连接只能支持*nux。

依赖项

  • 由异步框架tokiofutures实现的主要网络架构。
  • 用户数据通过序列化框架serde和二进制编码/解码包bincode转换为字节。

使用方法

要使用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