首页 > 解决方案 > 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 个连接,因此在之前接受的连接之一完成之前,不会接受和处理新的连接。

拜托,你能告诉我我做错了什么吗?非常感谢!

标签: rusttcpserver

解决方案


推荐阅读