原因
Rust标准库中的TCP流默认启用了一种叫Nagle的算法,它会避免高频发送小量的数据包,所以数据不会总是立即发送,这会对一些场合的应用产生影响。
解决方法
TCP流提供了一个方法叫set_nodelay,以下是标准库中的例子:
use std::net::TcpStream;
let stream = TcpStream::connect("127.0.0.1:8080")
.expect("Couldn't connect to the server...");
stream.set_nodelay(true).expect("set_nodelay call failed");
设置为true之后会禁用Nagle算法。
大多数ws库只要在创建连接前直接对stream使用set_nodelay(true)就能解决该问题。
对于使用actix作为ws库的要稍微绕一绕使用on_connect获取TCP流,例如:
HttpServer::new(|| {
// app
})
.on_connect(|stream, _| {
stream
.downcast_ref::<TcpStream>()
.unwrap()
.set_nodelay(true)
.unwrap();
})
.bind("0.0.0.0:8080")?
.run()
.await