我有以下代码可以从网络请求中读取:

fn handle_connection(mut stream: TcpStream) {
    let buf_reader = BufReader::new(&mut stream);
    let req: Vec<_> = buf_reader
        .lines()
        .map(|result| result.unwrap())
        .take_while(|line| !line.is_empty())
        .collect();

    println!("Request: {:#?}", req);
}

这与预期的http请求一样.

但是对于像‘redis-cli ping’这样的redis请求,它不能读取和超时.

我犯了什么错误?

推荐答案

Redis使用一种名为RESP(REDIS序列化协议)的协议,这是一种设计用于序列化数据 struct 的二进制安全协议.它不只是像HTTP那样的纯文本,所以对于Redis命令来说,简单地从TCP流中读取行并不总是正确的.

use std::io::{self, BufRead, BufReader};
use std::net::TcpStream;

fn handle_connection(mut stream: TcpStream) {
    let mut buf_reader = BufReader::new(&mut stream);

    loop {
        let mut line = String::new();
        match buf_reader.read_line(&mut line) {
            Ok(0) => break, // End of stream
            Ok(_) => {
                if line.starts_with("*") {
                    // Handle Redis command
                    // You will need to implement proper RESP parsing here
                    println!("Redis command: {}", line.trim());
                } else {
                    // Not a Redis command or end of command
                    break;
                }
            }
            Err(e) => {
                eprintln!("Failed to read from stream: {}", e);
                break;
            }
        }
    }
}

好评:https://redis.io/docs/reference/protocol-spec/#:~:text=RESP%20is%20essentially%20a%20serialization,an%20array%20of%20bulk%20strings.

Rust相关问答推荐

即使参数和结果具有相同类型,fn的TypId也会不同

使用铁 rust S还原对多个数组执行顺序kronecker积

为什么这是&q;,而让&q;循环是无限循环?

替换可变引用中的字符串会泄漏内存吗?

我如何制作一个变异迭代器来锁定内部数据直到删除?

如何实现Serde::Ser::Error的调试

获取与父字符串相关的&;str的原始片段

对于rustc编译的RISC-V32IM二进制文件,llvm objdump没有输出

如何执行数组文字的编译时串联?

将 &str 或 String 保存在变量中

为什么 Rust 字符串没有短字符串优化 (SSO)?

判断对象是 PyDatetime 还是 Pydate 的实例?

当 T 不是副本时,为什么取消引用 Box 不会抱怨移出共享引用?

为什么允许重新分配 String 而不是 *&String

如何在 Rust 中编写涉及异步的重试函数

Rust,使用枚举从 HashMap 获取值

为什么 no_std crate 可以依赖于使用 std 的 crate?

为实现特征的所有类型实现显示

以下打印数组每个元素的 Rust 代码有什么问题?

有没有办法在 Rust 中对 BigInt 进行正确的位移?