[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("전송 실패");
}
서버 먼저 돌리고

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

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

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