首页 > 解决方案 > 如何正确使用 Tokio TcpStream 收听和发送 ::connect

问题描述

我有这个简短的连接结构

ConnectionError {
    ConnectError(usize),
    SendError(usize),
}

#[derive(Debug, Clone)]
struct Connection {
    stream: Arc<Mutex<TcpStream>>,
    loc: usize,
}

impl Connection {
    async fn connect(loc:usize) -> Result<Connection, ConnectionError> {
        println!("Connecting");
        
        let mut stream = TcpStream::connect("3.85.107.207:80").await.map_err(|_| ConnectionError::ConnectError(loc))?;  

        //Start Listening
        let (r, w) = stream.split();


        Ok( Connection {
            stream: Arc::new(Mutex::new(stream)),
            loc: loc,
            }
        )
    }

    async fn Send(connection: Connection, string: String) -> Result<(), ConnectionError> {
        let mut stream = connection.stream.lock().await;
        stream.write_all(string.as_bytes()).await.map_err(|_| ConnectionError::SendError(connection.loc))?;
        Ok( () )
    }
}

我很难从哪里开始收听传入数据的流。我可以轻松发送数据 - 一切正常 - 只是不确定如何监听来自连接的输入。

次要问题:

我应该将 1a)TcpStream与 结合使用TcpListener吗?你甚至可以有 2 个像一个端口这样的连接吗?我来自对 python 的理解,我可以通过相同的连接收听和发送。

标签: rust

解决方案


ATcpListener有一个accept函数,它返回一个Result<(TcpStream, SocketAddr)>if/when 接收到连接。

那是您用来与远程客户端通信的流。通常,您通过spawn.

如果传入的 IP 也不同,并且您有足够的文件句柄来容纳它,那么给定的端口可以有实际上无限数量的连接。TCP 堆栈本身没有限制。


推荐阅读