use std::io::{self, BufRead, BufReader, Write};
use std::net::TcpStream;
use std::thread;
use std::sync::mpsc;
#[allow(dead_code)]
pub fn client_main(ip: &str) {
let server_addrs = vec![
"127.0.0.1:52525", "localhost:52525", ip,
];
println!("🔧 연결 시도할 주소들:");
for addr in &server_addrs {
println!(" - {}", addr);
}
let mut stream = None;
let mut connected_addr = String::new();
for server_addr in &server_addrs {
println!("🔄 서버 {}에 연결 중...", server_addr);
match TcpStream::connect(server_addr) {
Ok(s) => {
println!("✅ {}에 연결 성공!", server_addr);
stream = Some(s);
connected_addr = server_addr.to_string();
break;
}
Err(e) => {
println!("❌ {} 연결 실패: {}", server_addr, e);
}
}
}
let mut stream = match stream {
Some(s) => {
println!("🎉 서버 {}에 연결되었습니다!", connected_addr);
println!("💡 메시지를 입력하고 Enter를 누르세요. 'quit'를 입력하면 종료됩니다.\n");
s
}
None => {
eprintln!("❌ 모든 서버 주소 연결 실패");
eprintln!("💡 다음을 확인해주세요:");
eprintln!(" 1. WSL에서 서버가 실행 중인지 확인");
eprintln!(" 2. 방화벽 설정 확인");
eprintln!(" 3. IP 주소가 올바른지 확인");
return;
}
};
let stream_clone = stream.try_clone().unwrap();
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let mut reader = BufReader::new(stream_clone);
let mut buffer = String::new();
loop {
buffer.clear();
match reader.read_line(&mut buffer) {
Ok(0) => {
println!("🔌 서버 연결이 종료되었습니다.");
tx.send(()).unwrap();
break;
}
Ok(_) => {
print!("📨 {}", buffer);
io::stdout().flush().unwrap();
}
Err(e) => {
eprintln!("❌ 메시지 받기 오류: {}", e);
tx.send(()).unwrap();
break;
}
}
}
});
let stdin = io::stdin();
loop {
if rx.try_recv().is_ok() {
break;
}
print!("💬 메시지 입력: ");
io::stdout().flush().unwrap();
let mut input = String::new();
match stdin.read_line(&mut input) {
Ok(_) => {
let message = input.trim();
if message.eq_ignore_ascii_case("quit") {
println!("👋 채팅을 종료합니다.");
break;
}
if !message.is_empty() {
if let Err(e) = writeln!(stream, "{}", message) {
eprintln!("❌ 메시지 전송 오류: {}", e);
break;
}
}
}
Err(e) => {
eprintln!("❌ 입력 읽기 오류: {}", e);
break;
}
}
}
}