rust - TcpListener 锁定直到 TcpStream 关闭。如何处理新线程上的连接并避免阻塞?
问题描述
编辑:现在已经解决了,问题是我用来连接服务器的方式在 Windows 中出现了某种奇怪的行为。对不起 :(
我正在尝试编写一个简单的 TCP 服务器,其中每个连接都在一个新线程中处理。连接必须长时间保持活动状态,并且在处理客户端的连接时,必须接受并处理新的连接。
这是我正在运行的代码示例:
use std::net::{TcpListener, TcpStream};
use std::io::{Write, Read};
fn main() {
let addr_str = format!("0.0.0.0:{}", 1234);
if let Ok(tcp_listener) = std::net::TcpListener::bind(addr_str) {
tcp_listener.set_nonblocking(true);
println!("listening on 0.0.0.0:{}", 1234);
for tcp_stream in tcp_listener.incoming() {
if let Ok(mut tstream) = tcp_stream {
tstream.set_nonblocking(true);
println!("open connection!");
std::thread::spawn(move|| {
std::thread::sleep(std::time::Duration::from_millis(10000)); // sleep to simulate the processing, but in the real server it cloud be a really long task.. probably hours..
tstream.write(b"hello world:)");
println!("client disconnected ...");
});
}
}
} else {
println!("ERROR: unable to create TcpListener");
}
}
问题是它同时只接受 2 个连接,因此在之前接受的连接之一完成之前,不会接受和处理新的连接。
拜托,你能告诉我我做错了什么吗?非常感谢!
解决方案
推荐阅读
- javascript - 在关闭页面之前,Beforeunload 需要与网页进行一些交互
- python - 显示方程式结果的Tkinter动态标签?
- android - 适用于 API < 23 的 Android 密钥生成器
- php - 仅在用户首次登录时显示弹出窗口(Laravel)
- javascript - 在不重新渲染代码的情况下更新 React-Native 模态的可见性
- flutter - 颤振中的错误:widget_test.dart 无法检测到 MyApp() 请帮助我
- identityserver4 - 身份服务器 4. 资源所有者密码流程中的身份资源声明
- azure - 在本地使用 SQL Server 运行 ACI
- jquery - 在没有预览的情况下打印 2 个 html 部分的副本
- python - 创建一组包含该组作为属性的类对象?