rust - 如何正确使用 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 的理解,我可以通过相同的连接收听和发送。
解决方案
ATcpListener
有一个accept
函数,它返回一个Result<(TcpStream, SocketAddr)>
if/when 接收到连接。
那是您用来与远程客户端通信的流。通常,您通过spawn
.
如果传入的 IP 也不同,并且您有足够的文件句柄来容纳它,那么给定的端口可以有实际上无限数量的连接。TCP 堆栈本身没有限制。
推荐阅读
- php - ON DUPLICATE KEY UPDATE 给出意外行为
- scala - Future.zip 和 Future.zipWith 实现的细微差别。为什么?
- c# - 第一个字符串中的 TS1005 和 TS1002
- android - Android Studio底部栏导航:如何添加到每个片段?
- javascript - 使用 await setState() 是否正确?
- javascript - 如何在 HTML5 中包含 Cordova.js
- python - 计算特定 row_pandas 之前和之后的行之间的差异
- c# - linq 在 where 内动态查询
- python - PyWin32 Excel 单元格字符
- r - R CCA Plot:如何摆脱 plot() 中的重叠标签?