UDP猜数字游戏与TCP文件传输案例解析
目录
案例一:UDP协议实现的猜数字游戏
游戏概述
服务器端代码
客户端代码 (udp_client.py)
游戏特点
案例二:TCP协议实现的文件传输工具
工具概述
服务器端代码
客户端代码
工具特点
总结对比
案例一:UDP协议实现的猜数字游戏
游戏概述
这是一个基于UDP协议的客户端-服务器猜数字游戏,服务器随机生成一个1-100的数字,客户端通过猜测数字与服务器交互,服务器会提示猜测是太大还是太小。
服务器端实现步骤
-
导入所需模块
import socket import random
-
初始化游戏参数
num_boom = random.randint(1, 100) # 生成1-100的随机数 current_min = 1 # 当前最小范围 current_max = 100 # 当前最大范围
-
创建UDP套接字
sk = socket.socket(type=socket.SOCK_DGRAM) # 创建UDP socket
-
绑定IP和端口
sk.bind(('0.0.0.0', 8080)) # 绑定到所有可用IP的8080端口 print("游戏服务器已启动,等待玩家连接...")
-
主游戏循环
while True:# 等待客户端消息msg_client, addr = sk.recvfrom(1024) # 接收最多1024字节print(f"收到来自{addr}的消息")# 解析消息 (格式: "玩家名:猜测数字")try:name, guess_str = msg_client.decode("utf-8").split(":")guess = int(guess_str)except:sk.sendto("消息格式错误!请发送'名字:数字'".encode(), addr)continue
-
判断猜测结果
# 判断猜测大小if guess < num_boom:current_min = guess + 1response = f"{name}猜了{guess},太小了!当前范围: {current_min}-{current_max}"elif guess > num_boom:current_max = guess - 1response = f"{name}猜了{guess},太大了!当前范围: {current_min}-{current_max}"else:response = f"恭喜{name}!猜对了!数字是{num_boom}!"sk.sendto(response.encode(), addr)break# 发送响应sk.sendto(response.encode(), addr)
-
游戏结束处理
print("游戏结束") sk.close() # 关闭socket
客户端实现步骤
-
导入模块
import socket
-
创建UDP套接字
sk = socket.socket(type=socket.SOCK_DGRAM) # 创建UDP socket
-
设置服务器地址
server_addr = ('127.0.0.1', 8080) # 如果是本地测试就用127.0.0.1
-
玩家输入姓名
name = input("请输入你的游戏昵称: ")
-
游戏主循环
while True:# 获取玩家输入try:guess = int(input("请输入猜测的数字(1-100): "))if not 1 <= guess <= 100:print("请输入1-100之间的数字!")continueexcept:print("请输入有效的数字!")continue# 构造发送消息msg = f"{name}:{guess}"# 发送猜测到服务器sk.sendto(msg.encode(), server_addr)# 接收服务器响应response, _ = sk.recvfrom(1024) # 忽略返回的地址print(response.decode())# 检查是否猜对if "猜对了" in response.decode():break
-
关闭连接
sk.close() print("游戏结束,再见!")
游戏特点
-
使用UDP协议实现,适合简单的请求-响应式交互
-
服务器会动态更新猜测范围,提供更好的用户体验
-
包含玩家名称,使交互更加个性化
案例二:TCP协议实现的文件传输工具
工具概述
这是一个基于TCP协议实现的简单文件传输工具,支持文件上传功能(下载功能留作扩展)。
服务器端实现步骤
-
导入模块
import socket import json
-
创建TCP套接字
sk = socket.socket() # 默认就是TCP
-
绑定和监听
sk.bind(("0.0.0.0", 8080)) # 绑定所有IP的8080端口 sk.listen() # 开始监听 print("文件服务器已启动,等待连接...")
-
接受客户端连接
conn, addr = sk.accept() # 等待客户端连接 print(f"客户端{addr}已连接")
-
接收并解析数据
data = conn.recv(2048).decode("utf-8") # 接收数据 try:dic = json.loads(data) # 解析JSON except:conn.send("数据格式错误".encode())conn.close()exit()
-
处理上传请求
if dic["opt"] == "upload":# 获取文件名和内容file_name = dic["file_name"]content = dic["content"]# 保存文件try:with open(file_name, "w", encoding="utf-8") as f:f.write(content)conn.send(f"文件{file_name}上传成功!".encode())except:conn.send("文件保存失败".encode())
-
关闭连接
conn.close() sk.close()
客户端实现步骤
-
导入模块
import socket import os import json
-
创建TCP连接
sk = socket.socket() sk.connect(("127.0.0.1", 8080)) # 连接服务器
-
显示菜单
print(""" 文件传输菜单: 1. 上传文件 2. 下载文件 (暂未实现) """)
-
处理用户选择
choice = input("请选择操作(1/2): ")
-
上传文件处理
if choice == "1":# 获取文件路径file_path = input("请输入要上传的文件路径: ")# 检查文件是否存在if not os.path.exists(file_path):print("文件不存在!")sk.close()exit()# 读取文件内容try:with open(file_path, "r", encoding="utf-8") as f:content = f.read()except:print("无法读取文件内容")sk.close()exit()# 准备发送数据file_name = os.path.basename(file_path)data = {"opt": "upload","file_name": file_name,"content": content}# 发送JSON数据sk.send(json.dumps(data).encode())# 接收服务器响应response = sk.recv(1024).decode()print(response)
-
关闭连接
sk.close()
工具特点
-
使用TCP协议实现,确保数据传输的可靠性
-
采用JSON格式传输结构化数据
-
支持文本文件上传(可扩展为二进制文件)
-
菜单式交互界面,用户体验友好
总结对比
特性 | UDP猜数字游戏 | TCP文件传输 |
---|---|---|
协议类型 | UDP (无连接) | TCP (面向连接) |
适用场景 | 简单、快速、偶尔丢包可接受 | 可靠、有序的数据传输 |
数据格式 | 简单字符串 | JSON结构化数据 |
交互方式 | 请求-响应式 | 连接-传输-断开式 |
典型应用 | 实时游戏、视频流 | 文件传输、网页浏览 |
这两个案例展示了网络编程中两种主要协议的不同应用场景。UDP适合对实时性要求高但可以容忍少量丢包的应用,而TCP则适合需要可靠数据传输的场景。
希望这两个案例能帮助读者理解网络编程的基本原理和不同协议的应用场景。读者可以根据这些基础代码进行扩展,实现更复杂的功能。