TCPというプロトコルを使って情報を受け渡すサーバとクライアント
サーバ側
use std::net::{TcpListener,TcpStream};
use std::thread;
use std::io::{Read,Write,Error};
fn handle_data(mut stream: TcpStream) -> Result<(), Error> {
println!("Connection from: {}", stream.peer_addr()?);
let mut buf = [0; 512];
loop {
let byte_read = stream.read(&mut buf)?;
for i in 0..byte_read {
if buf[i] > 0x60 {
buf[i] = buf[i] - 0x20;
}
}
if byte_read == 0 {return Ok(());}
stream.write(&buf[..byte_read])?;
}
}
fn main() {
let coninfo = "localhost:8000";
let listener = TcpListener::bind(coninfo).expect("バインドできません。");
for steam in listener.incoming(){
match stream {
Err(e) => {eprintln!("failed: {}", e)}
Ok(stream) => {
thread::spawn(move || {
handle_data(stream).
unwrap_or_else(|error| eprintln!("{:?}", error));
});
}
}
}
}
クライアント側
use std::net::{TcpStream};
use std::str;
use std::io::{self,BufRead,BufReader,Write};
fn main() {
let coinfo = "localhost:8000";
let mut stream = TcpStream::connect(coinfo).expect("サーバに接続できません。");
loop {
let mut input = String::new();
io::stdin().read_line(&mut input).expect("標準入力からの入力エラー");
stream.write(input.as_bytes()).expect("サーバに送れません。");
let mut reader = BufReader::new(&stream);
reader.read_until(b'¥n', &mut buffer).expect("サーバから受け取れません");
print!("{}", str::from_utf8(&buffer).expect("テキストを表示できません"));
}
}
じゃんけんサーバ
use std::net::{TcpListener, TcpStream};
use std::thread;
use std::io::{Read,Write,Error};
use rand::{thread_rng, Rng};
fn handle_data(mut stream: TcpStream) -> Result<(), Error> {
println!("Connection from: {}", stream.peer_addr()?);
let mut buf = [0; 512];
loop {
let mut userte = false;
let mut cpmsg = String::new();
let mut msg = String::from("");
let byte_read = stream.read(&mut buf)?;
if byte_read == 0 {return Ok(());}
let mut rng = thread_rng();
let x: u16 = rng.gen_range(0, 3);
match x {
0 => cpmsg.insert_str(0, "私はグー"),
1 => cpmsg.insert_str(0, "私はチョキ"),
2 => cpmsg.insert_str(0, "私はパー"),
_ => cpmsg.insert_str(0, ""),
}
let client_msg = String::from_utf8(buf.to_vec()).unwrap();
msg.insert_str(0, &cpmsg);
if client_msg.starts_with("グー") {
userte=true;
match x {
0 => msg.push_str(":あいこ¥n");
1 => msg.push_str(":あなたの勝ち¥n");
2 => msg.push_str(":あなたの負け¥n");
_ => ();
}
} else if client_msg.starts_with("チョキ"){
userte=true;
match x {
0 => msg.push_str(":あなたの負け¥n");
1 => msg.push_str(":あいこ¥n");
2 => msg.push_str(":あなたの勝ち¥n");
_ => ();
}
} else if client_msg.starts_with("パー"){
userte=true;
match x {
0 => msg.push_str(":あなたの勝ち¥n");
1 => msg.push_str(":あなたの負け¥n");
2 => msg.push_str(":あいこ¥n");
_ => ();
}
} if userte {
let bytes = msg.as_bytes();
let len = bytes.len();
stream.write(&bytes[..len])?;
} else {
stream.write(&buf[..byte_read])?;
}
stream.flush()?;
}
}
fn main() {
let coninfo = "localhost:8000";
let listener = TcpListener::bind(coninfo).expect("バインドできません。");
for stream in listenr.incoming() {
match stream {
Err (e) => {eprintln!("failed: {}", e)}
Ok(stream) => {
thread::spawn(move || {
handle_data(stream).
unwrap_or_else(|error| eprintln!("{:?}", error));
});
}
}
}
}