初略测试,仅供参考
client和server在同一台机器(2.2 GHz 六核Intel Core i7/ssd硬盘/16g内存 )
读写分离(启动两个task/goroutine,一个读一个写),客户端生成文件,客户端从文件中读取数据写入到服务端
在服务端计算速率(收到的bytes/second)
文件20g 每次发送数据4k
Type
|
Rate
|
go Tcp
|
574m/s
|
rust Tcp / async_std
|
130m/s
|
rust Tcp / tokio
|
174m/s
|
文件20g 每次发送数据40k
Type
|
Rate
|
go Tcp
|
1775m/s
|
rust Tcp / async_std
|
673m/s
|
rust Tcp / tokio
|
542m/s
|
读写分离(启动两个task/goroutine) ,客户端不生成文件,客户端直接发送数据到服务端
每次发送的包大小为4k/go buffer为默认4k/ rust buffer为默认8k
Type
|
Rate
|
go Tcp
|
560~603m/s
|
go Tcp / bufio
|
500m/s
|
rust Tcp / async_std
|
1000 m/s
|
rust Tcp / async_std / BufWriter,BufReader
|
1280m/s
|
rust Tcp / tokio
|
900m/s
|
rust Tcp / tokio / BufWriter,BufReader
|
1150m/s
|
每次发送的包大小为40k/go buffer为默认4k/ rust buffer为默认8k
Type
|
Rate
|
go Tcp
|
1192m/s
|
go Tcp / bufio
|
1500m/s
|
rust Tcp / async_std
|
1444m/s
|
rust Tcp / async_std/ BufWriter,BufReader
|
1500m/s
|
rust Tcp / tokio
|
934m/s
|
rust Tcp / tokio / BufWriter,BufReader
|
1180m/s
|
读写不分离(不启动task/goroutine) ,客户端不生成文件,客户端直接发送数据到服务端
每次发送的包大小为4k/go buffer为默认4k/ rust buffer为默认8k
Type
|
Rate
|
go Tcp
|
190m/s
|
go Tcp /bufio
|
220m/s
|
rust Tcp / async_std
|
100m/s
|
rust Tcp / async_std / BufWriter,BufReader
|
110m/s
|
rust Tcp / tokio
|
129m/s
|
rust Tcp / tokio / BufWriter,BufReader
|
143m/s
|
每次发送的包大小为40k/go buffer为默认4k/ rust buffer为默认8k
Type
|
Rate
|
go Tcp
|
2250m/s
|
go Tcp / bufio
|
2250m/s
|
rust Tcp / async_std
|
676m/s
|
rust Tcp / async_std / BufWriter,BufReader
|
780m/s
|
rust Tcp / tokio
|
733m/s
|
rust Tcp / tokio / BufWriter,BufReader
|
820m/s
|
初略测试,仅供参考test 1读写分离(启动两个task/goroutine),客户端生成文件,客户端从文件中读取数据写入到服务端在服务端计算速率(收到的bytes/second)文件20g 每次发送数据4kTypeRatego Tcp574m/srust Tcp(async_std)130m/srust Tcp(tokio)174m/s文件20g 每次发送数据40kTypeRatego Tcp1775m/srust
Rust
-
socket
io客户端
用
Rust
编程语言编写的
socket
.io客户端的实现。 此实现当前支持
socket
.io协议的修订版5,因此支持engine.io协议的修订版4。 如果与此客户端有任何连接问题,请确保服务器至少使用engine.io协议的修订版4。
use
rust
_
socket
io :: {
Socket
Builder, Payload,
Socket
};
use serde_json :: json;
use std :: time :: Duration;
// define a callback which is called when a payload is received
// this callback gets the payload as well as an instance of the
//
socket
to communicate
fn main() {
let mut stream =
Tcp
Stream::connect("127.0.0.1:8080").expect("connect failed");
loop {
let mut input = String::new();
let size = io::stdin().read_line(&mut input).expect
以下是最基础的UDP服务端与客户端源代码,实现客户端发送数据,服务器接收数据的功能。与
TCP
的区别在于客户端与服务端无需经过三次握手建立连接,可直接在相应端口收发数据。且内部没有流控,重发等机制进行可靠性保证,协议实现相对
TCP
简单。可简单认为是带有端口信息的IP数据报。
一、C++实现
【1】服务端源代码(Windows)
#include "stdafx.h"
#include<WinSock2.h>
#include<iostream>
using namespace std
我们在上文《
Rust
网络编程框架-Tokio进阶》介绍了async/await和锁的基本用法,并完成了一个Server端的DEMO代码。本文继续来探讨这个话题。
客户端代码DEMO
上文中依靠telnet来触发服务端代码的执行,本文我们将自己实现一个客户端。由于笔者也没有从之前比如GO、JAVA等语言的套路中完全走出来,我最初的实现是这样的
#[tokio::main]asyncfnmain() {
letmutclient = client::connect("12...