当前位置: 首页 > news >正文

UDP猜数字游戏与TCP文件传输案例解析

目录

案例一:UDP协议实现的猜数字游戏

游戏概述

服务器端代码 

客户端代码 (udp_client.py)

游戏特点

案例二:TCP协议实现的文件传输工具

工具概述

服务器端代码 

客户端代码

工具特点

总结对比


案例一:UDP协议实现的猜数字游戏

游戏概述

这是一个基于UDP协议的客户端-服务器猜数字游戏,服务器随机生成一个1-100的数字,客户端通过猜测数字与服务器交互,服务器会提示猜测是太大还是太小。

服务器端实现步骤

  1. 导入所需模块

    import socket
    import random
  2. 初始化游戏参数

    num_boom = random.randint(1, 100)  # 生成1-100的随机数
    current_min = 1  # 当前最小范围
    current_max = 100  # 当前最大范围
  3. 创建UDP套接字

    sk = socket.socket(type=socket.SOCK_DGRAM)  # 创建UDP socket
  4. 绑定IP和端口

    sk.bind(('0.0.0.0', 8080))  # 绑定到所有可用IP的8080端口
    print("游戏服务器已启动,等待玩家连接...")
  5. 主游戏循环

    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
  6. 判断猜测结果

       # 判断猜测大小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)
  7. 游戏结束处理

    print("游戏结束")
    sk.close()  # 关闭socket

客户端实现步骤

  1. 导入模块

    import socket
  2. 创建UDP套接字

    sk = socket.socket(type=socket.SOCK_DGRAM)  # 创建UDP socket
  3. 设置服务器地址

    server_addr = ('127.0.0.1', 8080)  # 如果是本地测试就用127.0.0.1
  4. 玩家输入姓名

    name = input("请输入你的游戏昵称: ")
  5. 游戏主循环

    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
  6. 关闭连接

    sk.close()
    print("游戏结束,再见!")

游戏特点

  1. 使用UDP协议实现,适合简单的请求-响应式交互

  2. 服务器会动态更新猜测范围,提供更好的用户体验

  3. 包含玩家名称,使交互更加个性化

案例二:TCP协议实现的文件传输工具

工具概述

这是一个基于TCP协议实现的简单文件传输工具,支持文件上传功能(下载功能留作扩展)。

服务器端实现步骤

  1. 导入模块

    import socket
    import json
  2. 创建TCP套接字

    sk = socket.socket()  # 默认就是TCP
  3. 绑定和监听

    sk.bind(("0.0.0.0", 8080))  # 绑定所有IP的8080端口
    sk.listen()  # 开始监听
    print("文件服务器已启动,等待连接...")
  4. 接受客户端连接

    conn, addr = sk.accept()  # 等待客户端连接
    print(f"客户端{addr}已连接")
  5. 接收并解析数据

    data = conn.recv(2048).decode("utf-8")  # 接收数据
    try:dic = json.loads(data)  # 解析JSON
    except:conn.send("数据格式错误".encode())conn.close()exit()
  6. 处理上传请求

    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())
  7. 关闭连接

    conn.close()
    sk.close()

客户端实现步骤

  1. 导入模块

    import socket
    import os
    import json
  2. 创建TCP连接

    sk = socket.socket()
    sk.connect(("127.0.0.1", 8080))  # 连接服务器
  3. 显示菜单

    print("""
    文件传输菜单:
    1. 上传文件
    2. 下载文件 (暂未实现)
    """)
  4. 处理用户选择

    choice = input("请选择操作(1/2): ")
  5. 上传文件处理

    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)
  6. 关闭连接

    sk.close()

工具特点

  1. 使用TCP协议实现,确保数据传输的可靠性

  2. 采用JSON格式传输结构化数据

  3. 支持文本文件上传(可扩展为二进制文件)

  4. 菜单式交互界面,用户体验友好

总结对比

特性UDP猜数字游戏TCP文件传输
协议类型UDP (无连接)TCP (面向连接)
适用场景简单、快速、偶尔丢包可接受可靠、有序的数据传输
数据格式简单字符串JSON结构化数据
交互方式请求-响应式连接-传输-断开式
典型应用实时游戏、视频流文件传输、网页浏览

这两个案例展示了网络编程中两种主要协议的不同应用场景。UDP适合对实时性要求高但可以容忍少量丢包的应用,而TCP则适合需要可靠数据传输的场景。

希望这两个案例能帮助读者理解网络编程的基本原理和不同协议的应用场景。读者可以根据这些基础代码进行扩展,实现更复杂的功能。


http://www.mrgr.cn/news/98665.html

相关文章:

  • 【Windows Cmake工程配置Boost库】
  • element-ui自定义主题
  • Java Web 300问
  • Cursor入门教程-JetBrains过度向
  • Serverless集群搭建:Knative
  • 前端基础之《Vue(5)—组件基础》
  • HOW - 项目 link 本地开发库进行调试
  • 【c语言】深入理解指针1
  • 任务的状态
  • 硬件电路设计之51单片机(2)
  • 2.一维卡尔曼滤波(动态模型)
  • leetcode 122. Best Time to Buy and Sell Stock II
  • LeetCode -- Flora -- edit 2025-04-16
  • 深度学习-卷积层(代码+理论)python opencv源码(史上最全)
  • idea中提高编译速度研究
  • ESP8266/32作为AVR编程器(ISP programmer)的使用介绍
  • 基于DS-TWR(双边双向测距)的平面定位MATLAB例程,包含模拟数据生成、距离计算和最小二乘定位(附完整代码,订阅专栏后可直接查看)
  • JWT 鉴权机制 通俗易懂解释版本
  • 投行风控和交易高可靠分布式锁核心要素与实现方案
  • SparseDrive---论文阅读