# 20252428 2025-2026-2 《Python程序设计》实验三报告

20252428 2025-2026-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2524
姓名: 代林淞
学号: 20252428
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课

1.实验内容

创建服务端和客户端,服务端在特定端口监听客户请求。客户端和服务端通过Socket套接字(TCP)进行通信。

实验要求

  • 每人必须做一次客户端和一次服务端,且要和队友互相通信
  • 发送方输入内容,加密后并传输;接收方收到密文并解密和显示
  • 发方和收方同时输出明文和密文
  • 使用LLM生成带图形界面的程序,分析关键代码功能和使用方法,分析生成程序的优点,给出运行过程和结果

2. 实验过程及结果

2.1 加密原理

本实验采用XOR加密 + Base64编码的方式实现数据加密:

KEY = "12345678"

def encrypt(msg):
    # XOR加密:明文字符与密钥循环XOR
    encrypted = ""
    for i, c in enumerate(msg):
        encrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
    # Base64编码,使其可打印
    return base64.b64encode(encrypted.encode()).decode()

def decrypt(msg):
    # Base64解码 + XOR解密
    decoded = base64.b64decode(msg.encode()).decode()
    decrypted = ""
    for i, c in enumerate(decoded):
        decrypted += chr(ord(c) ^ ord(KEY[i % len(KEY)]))
    return decrypted

2.2 命令行版本

服务器端(实验3服务器端.py)

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "10.71.163.28"
PORT = 4444

server.bind((HOST, PORT))  # 绑定IP和端口
server.listen(5)           # 监听连接,最大队列5
conn, addr = server.accept()  # 接受客户端连接

# 循环处理:接收->解密显示->输入->加密发送
while True:
    encrypted_data = conn.recv(1024).decode()
    plaintext = decrypt(encrypted_data)
    print(f"【接收】明文:{plaintext}")
    print(f"【接收】密文:{encrypted_data}")
    
    send_msg = input("请输入回复:")
    encrypted_reply = encrypt(send_msg)
    conn.send(encrypted_reply.encode())
    print(f"【发送】明文:{send_msg}")
    print(f"【发送】密文:{encrypted_reply}")

客户端(实验3客户端.py)

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "10.71.163.27"  # 服务器IP
PORT = 4444

client.connect((HOST, PORT))  # 连接服务器

# 循环处理:输入->加密发送->接收->解密显示
while True:
    send_msg = input("请输入发送内容:")
    encrypted = encrypt(send_msg)
    client.send(encrypted.encode())
    print(f"【发送】明文:{send_msg}")
    print(f"【发送】密文:{encrypted}")
    
    encrypted_reply = client.recv(1024).decode()
    reply = decrypt(encrypted_reply)
    print(f"【接收】明文:{reply}")
    print(f"【接收】密文:{encrypted_reply}")

运行结果

服务器端输出:

客户端输出:


2.3 GUI版本(使用LLM生成)

关键代码功能分析

组件 功能 说明
socket.socket(AF_INET, SOCK_STREAM) 创建TCP套接字 IPv4地址族,TCP协议
bind((HOST, PORT)) 绑定地址端口 服务器绑定IP和端口
listen(5) 监听连接 最大等待队列5个
accept() 接受连接 阻塞等待客户端连接
connect() 发起连接 客户端连接服务器
threading.Thread 多线程 接收消息不阻塞UI
tkinter GUI库 Python内置,无需安装
scrolledtext 滚动文本框 显示聊天记录

GUI服务器关键代码

class ChatServerApp:
    def start_server(self):
        self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server_socket.bind((host, port))
        self.server_socket.listen(1)
        threading.Thread(target=self.accept_client, daemon=True).start()
    
    def accept_client(self):
        self.conn, addr = self.server_socket.accept()
        threading.Thread(target=self.receive_messages, daemon=True).start()
    
    def send_message(self):
        encrypted = encrypt(msg)
        self.conn.send(encrypted.encode())
        self.log(f"【发送】明文: {msg}")
        self.log(f"【发送】密文: {encrypted}")

GUI客户端关键代码

class ChatClientApp:
    def connect_server(self):
        self.client_socket.connect((host, port))
        threading.Thread(target=self.receive_messages, daemon=True).start()
    
    def send_message(self):
        encrypted = encrypt(msg)
        self.client_socket.send(encrypted.encode())
        self.log(f"【发送】明文: {msg}")
        self.log(f"【发送】密文: {encrypted}")
    
    def receive_messages(self):
        while self.running:
            encrypted_data = self.client_socket.recv(1024).decode()
            plaintext = decrypt(encrypted_data)
            self.log(f"【接收】明文: {plaintext}")
            self.log(f"【接收】密文: {encrypted_data}")

生成程序的优点

  1. 可视化界面:图形化操作,无需命令行
  2. 实时显示:明文和密文同时显示,直观清晰
  3. 多线程处理:接收消息不阻塞主界面,响应流畅
  4. 状态显示:实时显示连接状态(未启动/监听中/已连接)
  5. 输入验证:空消息不允许发送,防止无效通信
  6. 滚动查看:聊天记录可滚动,支持长对话
  7. 易用性:回车键或按钮均可发送,操作便捷

运行过程和结果

3. 实验过程中遇到的问题和解决过程

  • 问题1:客户端连接服务器时出现"Connection refused"错误

    • 问题1解决方案:检查服务器IP是否正确,确保服务器先启动并处于监听状态,防火墙允许端口通信
  • 问题2:GUI界面在接收消息时卡死

    • 问题2解决方案:使用threading.Thread将接收消息的阻塞操作放入独立线程,避免阻塞主UI线程
  • 问题3:解密后显示乱码

    • 问题3解决方案:在加密后使用Base64编码,确保传输的数据都是可打印字符,避免编码问题

其他(感悟、思考等)

通过本次实验,我掌握了:

  1. Python Socket编程:学习了TCP服务器和客户端的创建、绑定、监听、接受连接和数据收发流程
  2. 数据加密实现:理解了XOR加密原理和Base64编码的作用,实现了简单的对称加密
  3. 网络通信调试:学会了使用IP地址和端口进行网络通信,理解了客户端/服务器架构

本次实验让我认识到网络安全的重要性,虽然本实验使用的XOR加密强度较低,但体现了加密通信的基本原理,为后续学习更复杂的加密算法奠定了基础。


参考资料

posted @ 2026-04-27 21:13  Doglists  阅读(10)  评论(0)    收藏  举报