【发布时间】:2023-01-10 04:55:58
【问题描述】:
我目前正在尝试使用 Tokio 和广播频道编写服务器和客户端。我有一个基本上监听连接的循环,在读取 TcpStream 之后,我通过通道发送。
这是我尝试过的代码:
每次我连接到服务器并读取字节时,我最终得到的是打印..,但我从来没有收到“已收到”
use dbjade::serverops::ServerOp;
use tokio::io::{BufReader};
use tokio::net::TcpStream;
use tokio::{net::TcpListener, io::AsyncReadExt};
use tokio::sync::broadcast;
const ADDR: &str = "localhost:7676"; // Your own address : TODO change to be configured
const CHANNEL_NUM: usize = 100;
use std::io;
use std::net::{SocketAddr};
use bincode;
#[tokio::main]
async fn main() {
// Create listener instance that bounds to certain address
let listener = TcpListener::bind(ADDR).await.map_err(|err| panic!("Failed to bind: {err}")).unwrap();
let (tx, mut rx) = broadcast::channel::<(ServerOp, SocketAddr)>(CHANNEL_NUM);
loop {
if let Ok((mut socket, addr)) = listener.accept().await {
let tx = tx.clone();
let mut rx = tx.subscribe();
println!("Receieved stream from: {}", addr);
let mut buf = vec![0, 255];
tokio::select! {
result = socket.read(&mut buf) => {
match result {
Ok(res) => println!("Bytes Read: {res}"),
Err(_) => println!(""),
}
tx.send((ServerOp::Dummy, addr)).unwrap();
}
result = rx.recv() =>{
let (msg, addr) = result.unwrap();
println!("Receieved: {msg}");
}
}
}
}
}
【问题讨论】:
-
我不知道这是否是您问题的根源,但据我所知,
read()不是取消安全的 - 您不应该在select中使用它。
标签: rust rust-tokio