Rust TCP как получить длину байта массива? - PullRequest
1 голос
/ 03 мая 2020

У меня TCP-клиент в ржавчине, который должен взаимодействовать с Java сервером. Я получил основы работы и могу посылать между ними байтовые массивы.

Но для буфера байтового массива мне нужно знать длину байтового массива. Но я не знаю, я должен получить это. На данный момент у меня есть только фиксированный размер буфера.

Мой код Rust выглядит так:

    loop {
        let mut buffer = vec![0; 12]; //fixed buffer length
        let n = stream.read(&mut buffer).await;
        let text = from_utf8(&buffer).unwrap();
        println!("{}", text);
    }

В Java вы можете отправить размер Буферизуйте непосредственно как Integer с DataInputStream. Есть ли возможность сделать это в ржавчине?

Например, вот как я делаю это в Java:

    public String readMsg(Socket socket) throws IOException {
        DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
        byte[] bytes = new byte[in.readInt()]; //dynamic buffer length
        in.readFully(bytes);
        return new String(bytes, StandardCharsets.US_ASCII);
    }

1 Ответ

2 голосов
/ 03 мая 2020

То, что вы хотите знать, является свойством протокола, который вы используете. Это не свойство языка программирования, который вы используете. Исходя из вашего Java кода, создается впечатление, что вы используете протокол, который отправляет поле длиной 4 байта перед данными сообщения (со знаком / без знака?).

Если это так, вы можете справиться с чтением сообщения Точно так же в Rust: 1. Считайте 4 байта, чтобы получить информацию о длине. 2. Считайте оставшиеся данные. 3. Десериализуйте данные

fn read_message(stream: Read) -> io::Result<String> {
    let mut buffer = [0u8; 4];
    // Read the length information
    stream.read_exact(&mut buffer[..])?;
    // Deserialize the length
    let size = u32::from_be_bytes(buffer);
    // Allocate a buffer for the message
    // Be sure to check against a maximum size before doing this in production
    let mut payload = vec![0; size];
    stream.read_exact(&mut payload[..]).await;
    // Convert the buffer into a string
    let text = String::from_utf8(payload).map_err(/* omitted */)?;
    println!("{}", text);
    Ok(text)
}

Это, очевидно, верно только в том случае, если ваш протокол использует префикс длины сообщения с 4-байтовым беззнаковым префиксом int. Это то, что вам нужно проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...