目录
案例一: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 + 1 response = f"{name}猜了{guess},太小了!当前范围: {current_min}-{current_max}" elif guess > num_boom: current_max = guess - 1 response = 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之间的数字!") continue except: 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则适合需要可靠数据传输的场景。
希望这两个案例能帮助读者理解网络编程的基本原理和不同协议的应用场景。读者可以根据这些基础代码进行扩展,实现更复杂的功能。