簡體   English   中英

了解如何使用 rust TOKIO 庫

[英]Understanding how to use rust TOKIO library

我想學習rust Tokio圖書館。 為了方便這一點,我想在 rust 中編寫一個 ASYNC TCP 記錄器。

基本上是一個連接到 TCP 服務器(172.16.10.10 端口 7777)的 TCP 客戶端,並且只將異步接收的消息記錄到日志文件中。 我希望主要的 function 從控制台讀取用戶輸入——在我的例子中是按下“q”鍵——模擬程序執行其他任務。

我希望在等待用戶按下“q”鍵時收到多個 TCP 響應。

我正在嘗試鍛煉如何獨立於等待用戶輸入來讀取和記錄多個 TCP 響應

let mut buf_reader = BufReader::new(&stream);
let mut data = vec![];
buf_reader.read_to_end(&mut data).await.unwrap();
log_writer.write_all(&data).await.unwrap();`

這是我的代碼

use tokio::net::TcpStream;
use tokio::prelude::*;
use std::io::{stdin, stdout, Write, BufWriter, BufReader};
use std::fs::File;

#[tokio::main]
async fn main() {
    let ip = "172.16.10.10:7777";
    let mut stream = TcpStream::connect(ip).await.unwrap();
    let message = [0x16, 0x02];
    stream.write(&message).await.unwrap();

    // Open a file for logging
    let file = File::create("log.txt").unwrap();
    let mut log_writer = BufWriter::new(file);

    println!("Press 'q' to exit and receive response:");
    stdout().flush().unwrap();
    let mut input = String::new();
    stdin().read_line(&mut input).unwrap();
    if input.trim() == "q" {
        // SIMULATE doing time consuming task
        println!(“Quitting”);
    }
}

我嘗試了以下操作,但這會循環等待用戶輸入。 這不是我想要的行為。 我想獨立於等待用戶輸入來讀取和記錄 TCP 消息。

loop {
    stdin().read_line(&mut input).unwrap();
    if input.trim() == "q" {
        break;
    }
    let mut data = vec![];
    buf_reader.read_to_end(&mut data).await.unwrap();
    log_writer.write_all(&data).await.unwrap();
}

當我需要異步多線程時,我定義了多個async fn來做我想做的事情,然后在async fn main中調用它們:

let handle1 = tokio::spawn(do_it("test_data.txt"));
let handle2 = tokio::spawn(do_something_else("test_data.txt"));
handle1.await.unwrap();
handle2.await.unwrap();

由於我熱衷於使fn main盡可能小,這可能不適合你,但可能會給你一個方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM