2017-03-28 3 views
0

녹에 소켓 서버를 작성하고 응답/송신 코드를 구현했습니다. 가장 큰 문제는 연결이 닫힐 때까지 방법 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이라는 한 줄을 읽으 려합니다. 당신은 BufReaderRead를 구현 뭔가를 포장 할 수 있습니다

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() {} 

추가 노트를 원래 코드 :

  1. 오류을 무시하지 마십시오. 오류를 무시하려면 녹이 사용하는 언어가 아닐 수도 있습니다. 오류는 무시하기 어렵도록 설계되었습니다.

  2. streamconn으로 다시 바인딩 할 이유가 없습니다. 단지 변경 가능해야합니다.

  3. 매크로를 write!writeln! 매크로를 사용하여 Read을 구현하는 형식으로 단순화하십시오.

  4. "".to_string을 사용하지 마십시오. String::new 만 사용하십시오.

  5. response의 유형을 두 번 나열 (: String, = String::new()) 할 이유가 없습니다. 유형 유추를 처리하도록합니다.

  6. 명시 적 return 진술은 관용적 인 녹이 아닙니다.

+0

대단히 감사합니다. 저는 방금 Rust와 함께 시작했으며 일반 구문/방법론에 여전히 익숙해 져 있습니다. 이것은 정말로 도움이됩니다. – f3rn0s

관련 문제