[Rust] 소켓통신해보기

그냥 간단하게 메세지 주고받는걸 서버-클라이언트 구조로 구현해보려 한다.

사용할 모듈은 std::net이다.
rust는 표준에 통신 모듈이 자체적으로 들어있어서 뭘 따로 땡겨쓸 필요는 없다.

일단 해보자.
컴퓨터 두개 쓰기는 귀찮아서 그냥 루프백 아이피로 혼자 북치고 장구치고 했다.
제대로 하려면 아이피 구해서 갖다박으면 된다.


//서버 측 코드
use std::net::*;

//루프백 IP
const IP_ADDRESS:&str = "127.0.0.1:56789";

fn main()
{
    //리스너 생성
    let listener = TcpListener::bind(IP_ADDRESS).expect("bind 실패");

    println!("## Server Running ##");

    for stream in listener.incoming() {
        if stream.is_ok() {
            println!("클라이언트 연결됨");
        }
    }
}

//클라이언트 측 코드
use std::net::*;

const IP_ADDRESS: &str = "127.0.0.1:56789";

fn main()
{
    //그냥 연결만 함
    let stream =
        TcpStream::connect(IP_ADDRESS).expect("connect 실패");
}

이렇게 짜놓고 서버를 먼저 컴파일해서 돌린다.
서버는 당연히 무한루프로 계속 돌아야한다.


잘 돌아간다.


이제 클라이언트로 신호를 줘보자

실행을 하니


인식을 했다.

이제 뭔가 데이터를 주고받아보자.



//서버 측 코드
use std::net::*;
use std::io::Read; //명시 안하면 'read'에서 에러남!

//루프백 IP
const IP_ADDRESS:&str = "127.0.0.1:56789";

fn handle_client(mut stream: TcpStream)
{
    //입력 버퍼
    let mut input = [0 as u8; 50];

    //받을때까지 계속 루프 돌림
    while stream.read(&mut input).is_err() { /*nothing*/ }

    println!("$ 클라이언트: {}", String::from_utf8_lossy(&input));
}

fn main()
{
    //리스너 생성
    let listener = TcpListener::bind(IP_ADDRESS).expect("bind 실패");

    println!("## Server is Running ##");

    for stream in listener.incoming() {
        if stream.is_ok() {
            handle_client(stream.unwrap());
        }
    }
}
//클라이언트 측 코드
use std::net::*;
use std::io::Write; //표시 안하면 에러남!

const IP_ADDRESS: &str = "127.0.0.1:56789";

fn main()
{
    //그냥 연결만 함
    let mut stream =
        TcpStream::connect(IP_ADDRESS).expect("connect 실패");

    stream.write("안녕하세요?".as_bytes()).expect("전송 실패");
}

서버 먼저 돌리고

클라이언트가 문자열을 쏘면

서버에서 받아서 로그에 띄운다.

나머지는 응용만 하면 된다.