Tokio异步应用新手开发聊天程序遇到的TCP读写问题求助
问题成因分析
1. 服务端未正确执行异步写入操作
你在服务端遍历客户端写队列时,直接在同步的filter_map闭包中调用Tokio的异步write方法,没有对返回的Future执行await,实际上写入操作根本没有被调度执行,消息始终滞留在缓冲区中没有发往客户端。同时你也没有检查写入的返回值、没有主动执行flush操作,即使写入被调度也不能保证数据立即被发送到网络中。
2. 客户端错误使用try_*系列非阻塞方法
Tokio提供的try_read/try_write/try_recv系列方法仅适合在已经确认IO/通道就绪的场景下调用,直接在无等待的死循环中调用这类方法,绝大部分情况下都会返回WouldBlock错误。同时你的客户端循环中没有任何await点,会一直占满所在的Tokio工作线程,调度器无法处理IO就绪事件,就算服务端真的发了消息,客户端也感知不到IO就绪。
3. 客户端TcpStream未做读写拆分
Tokio的TcpStream要实现同时读写,必须调用split方法拆分为独立的读半区和写半区,否则同一个流的读写操作会互相抢占可变引用,导致IO操作无法正常执行。
4. 断开连接时的空消息问题
当服务端主动关闭连接后,TCP连接进入半关闭状态,此时客户端调用读取操作会返回Ok(0)(表示对端已关闭),你的代码没有判断读取到的字节长度,直接过滤掉所有0字节就会得到空数组,加上死循环没有退出逻辑,就会持续打印空消息。
内容的提问来源于stack exchange,提问作者herpderp
相关产品推荐
相关产品推荐

