2017-03-28 21 views
0

私はRustにソケットサーバーを作成しており、応答/送信コードを実装しています。主な問題は、メソッドread_to_stringは、改行が表示されるまで接続が閉じられるまで機能しないということです。例えばread_to_stringを使用しているときに新しい行を止める方法はありますか?

は、このコードでは、

use std::net::{TcpListener, TcpStream}; 
use std::io::Write; 
use std::io::Read; 

fn handle_client(stream: TcpStream) { 
    let conn = stream; 
    let conn = send(conn, "Hello!"); 
    let mut conn = send(conn, "Bye!"); 
    fn send(mut stream: TcpStream, s: &str) -> TcpStream { 
     let giver = format!("{}\n", s); 
     let _ = stream.write(giver.into_bytes().as_slice()); 
     return stream; 
    } 
    let mut response: String = "".to_string(); 
    let length = conn.read_to_string(&mut response); // ignore here too 
    println!("Message:\n{}\n\nLength: {}", response, length.unwrap()); 
} 

サーバーは、任意のデータを提示する前に、接続解除を待ちます。応答が改行に解析するように

は、どのように私はそれを行うことができますか?

答えて

2

あなたは、単一の行、BufRead::read_lineと呼ばれる方法を読みたいです。エラーを無視しないでください

  1. :元のコードに

    use std::io::{Write, BufRead, BufReader}; 
    use std::net::TcpStream; 
    
    fn handle_client(mut conn: TcpStream) { 
        writeln!(&mut conn, "Hello!").expect("Unable to write"); 
        writeln!(&mut conn, "Bye!").expect("Unable to write"); 
    
        let mut response = String::new(); 
        let mut conn = BufReader::new(conn); 
        let length = conn.read_line(&mut response).expect("unable to read"); 
        println!("Message:\n{}\n\nLength: {}", response, length); 
    } 
    
    fn main() {} 
    

    その他の注意事項:あなたはBufReaderReadを実装何かをラップすることができます。エラーを無視したい場合、Rustはあなたが楽しむ言語ではないかもしれません。エラーは無視しにくいように設計されています。

  2. streamconnに再バインドする理由はありません。変更可能にするだけです。

  3. write!writeln!のマクロを使用して、Readを実装する形式に簡単にします。

  4. だけString::newを使用し、"".to_stringを使用しないでください。

  5. responseのタイプを2回(: String,= String::new())リストする理由はありません。タイプ推論で処理するだけです。

  6. 明示return文は慣用錆はありません。

+0

ありがとう、私は最近、Rustから始め、一般的な構文/方法論に慣れています。これは本当に役立ちます。 – f3rn0s

関連する問題