本节将详细讲解王语嫣客户端(client_yuyang)与(client_tanzhi)的实现,配合服务器端和游坦之客户端,可本地或局域网回合对战。
连接成功


1. 客户端概述
- 通过TCP连接服务器,自动分配角色为“王语嫣”
- 实时接收并打印服务器广播的状态、指令与结果
- 每当轮到自己时,会自动提示输入(attack/skill/defend),并发送指令给服务器,等待对方操作
- 断线或胜负后,给出总结输出
2. 架构与交互流程
- 建议项目结构
- client_yuyang/
- Cargo.toml
- src/
- main.rs(下方给出)
- client_yuyang/
- 网络目标地址设为本地127.0.0.1:6123,便于本机实验
- 只需运行服务器与两个客户端,即可回合对战
3. 完整客户端代码(main.rs)
use std::io::{self, BufRead, BufReader, Write};
use std::net::TcpStream;
fn main() {
let mut stream = TcpStream::connect("127.0.0.1:6123").expect("无法连接服务器");
let mut reader = BufReader::new(stream.try_clone().unwrap());
let mut welcome = String::new();
reader.read_line(&mut welcome).unwrap();
print!("{}", welcome);
loop {
let mut server_msg = String::new();
if reader.read_line(&mut server_msg).is_err() || server_msg.is_empty() {
println!("服务器已断开"); break;
}
print!("{}", server_msg);
if server_msg.contains("请输入") || server_msg.contains("请选择") {
print!("> "); // ***增加手动操作符提示符
io::stdout().flush().unwrap();
let mut input = String::new();
if let Ok(_) = io::stdin().read_line(&mut input) {
stream.write_all(input.as_bytes()).unwrap();
stream.flush().unwrap();
} else {
println!("输入读取失败,请直接键入英文attack/skill/defend并回车");
}
}
if server_msg.contains("胜利") {
println!("游戏结束。");
break;
}
}
}
4. 启动与调试方法
- 建议使用VSCode终端或多窗口cmd分别运行服务器和两个客户端
- 保证服务器先开启:
cargo run启动wang_vs_you - 随后分别进入client_yuyang和另一个客户端目录,均用
cargo run启动 - 按屏幕提示输入 attack/skill/defend…
5. 调试与扩展建议
- 若本地实测发现断线、显示乱码,可尝试更换终端或补充错误处理
- 客户端设计解耦,便于增加图形化、外挂AI(自动出招)
- 扩展支持:服务器IP/端口在启动参数里自定义,更贴合实际分布式部署
本案例适合 Rust 并发、网络、命令行工程入门及实践训练。配合服务器端和游坦之客户端一同使用体验最佳!
1. 客户端功能说明
- 以TCP方式连接服务器(本地
127.0.0.1:6123),被分配为游坦之角色 - 实时接收服务器所有的“回合状态”、“轮到你操作”、回合结算/胜负信息
- 每当服务器通知“轮到你”时,自主输入(attack/skill/defend),发送操作给服务器
- 游戏结束或断线时自动退出循环
2. 项目结构建议
建议如下目录:
- client_tanzhi/
- Cargo.toml
- src/
- main.rs(如下代码)
启动与王语嫣、服务器对应,无需特殊区分,体验上完全独立。
3. 完整客户端代码(main.rs)
use std::io::{self, BufRead, BufReader, Write};
use std::net::TcpStream;
fn main() {
let mut stream = TcpStream::connect("127.0.0.1:6123").expect("无法连接服务器");
let mut reader = BufReader::new(stream.try_clone().unwrap());
let mut welcome = String::new();
reader.read_line(&mut welcome).unwrap();
print!("{}", welcome);
loop {
let mut server_msg = String::new();
if reader.read_line(&mut server_msg).is_err() || server_msg.is_empty() {
println!("服务器已断开"); break;
}
print!("{}", server_msg);
if server_msg.contains("请输入") || server_msg.contains("请选择") {
print!("> "); // ***增加手动操作符提示符
io::stdout().flush().unwrap();
let mut input = String::new();
if let Ok(_) = io::stdin().read_line(&mut input) {
stream.write_all(input.as_bytes()).unwrap();
stream.flush().unwrap();
} else {
println!("输入读取失败,请直接键入英文attack/skill/defend并回车");
}
}
if server_msg.contains("胜利") {
println!("游戏结束。");
break;
}
}
}
4. 启动与联调说明
- 启动顺序:建议先开服务器,再分别运行两个客户端
- 每个客户端可单独终端,可支持本地或局域网回合对战
- 按提示输入操作(attack/skill/defend),观战效果实时反馈
5. 扩展建议
- 加入AI托管、GUI或网络参数可选、重连机制等
- 通用框架便于团队扩展多角色/多人协作等场景
本客户端适合与服务器端、王语嫣端一同组合训练网络与并发、项目拆解与工程化能力。
4万+

被折叠的 条评论
为什么被折叠?



