20253332 实验三《Python程序设计》实验报告

20253332 2025-2026-2 《Python程序设计》实验x报告

课程:《Python程序设计》
班级: 2533
姓名: 向家沣
学号:20253332
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课

📑 目录

** 1.实验内容**
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
实验要求:
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。
(3)程序代码托管到码云。
(4)添加文件操作,有加分。(可选项)
要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析生成程序的优点
(3)给出运行过程和结果截图
(4)程序代码托管到码云。
** 2. 实验过程及结果**
2.1
<1> 环境准备
使用PyCharm编写代码,两台电脑接入同一校园局域网,分别设置固定内网IP:
本机服务端IP:10.65.183.32
队友客户端IP:10.65.183.17,端口统一绑定4444。
<2> 加密设计
采用ASCII码偏移加密,统一偏移量为5,
加密:字符ASCII码+5,
解密:字符ASCII码-5,
两端密钥一致,保证加解密正常匹配。
<3> 代码编写
服务端完成bind绑定、listen监听、accept接入;
客户端通过IP+端口主动连接服务端;
收发消息前后分别执行加密、解密操作,控制台同步输出明文、密文。
客户端:

# -*- coding: utf-8 -*-
# 文件名: SocketClient
# 描  述: TCP加密通信客户端
# 作  者: besti
# 日  期: 2026/4/27
#  Have you ever seen Los Angeles at 4 a.m?
import socket

SHIFT = 5

def shift_encrypt(content):
    result = []
    for char in content:
        result.append(chr(ord(char) + SHIFT))
    return ''.join(result)

def shift_decrypt(content):
    result = []
    for char in content:
        result.append(chr(ord(char) - SHIFT))
    return ''.join(result)

def main():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    SERVER_HOST = "10.65.183.17"
    SERVER_PORT = 4444
    client_socket.connect((SERVER_HOST, SERVER_PORT))
    print("已连接服务端!")

    while True:
        user_input = input("我:")
        encrypted_msg = shift_encrypt(user_input)
        print(f"我发送明文:{user_input}")
        print(f"我发送密文:{encrypted_msg}")
        client_socket.send(encrypted_msg.encode("utf-8"))

        if user_input == "exit":
            break

        server_encrypted = client_socket.recv(1024).decode("utf-8")
        server_plain = shift_decrypt(server_encrypted)
        print(f"服务端明文:{server_plain}")
        print(f"服务端密文:{server_encrypted}")

    client_socket.close()

if __name__ == "__main__":
    main()

服务端:

# -*- coding: utf-8 -*-
# 文件名: SocketServer
# 描  述: TCP加密通信服务端
# 作  者: besti
# 日  期: 2026/4/27
#  Have you ever seen Los Angeles at 4 a.m?
import socket

OFFSET = 5

def text_encrypt(text):
    encrypted_chars = []
    for c in text:
        encrypted_chars.append(chr(ord(c) + OFFSET))
    return "".join(encrypted_chars)

def text_decrypt(text):
    decrypted_chars = []
    for c in text:
        decrypted_chars.append(chr(ord(c) - OFFSET))
    return "".join(decrypted_chars)

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    HOST = "10.65.183.32"
    PORT = 4444
    server_socket.bind((HOST, PORT))
    server_socket.listen(1)
    print("服务端已经启动,等待客户端连接......")

    conn, client_addr = server_socket.accept()
    print(f"已连接客户端:{client_addr}")

    while True:
        client_encrypted = conn.recv(1024).decode("utf-8")
        if not client_encrypted or client_encrypted == text_encrypt("exit"):
            print("聊天结束")
            break

        client_plain = text_decrypt(client_encrypted)
        print(f"客户端明文:{client_plain}")
        print(f"客户端密文:{client_encrypted}")

        server_input = input("我:")
        server_encrypted = text_encrypt(server_input)
        print(f"我发送明文:{server_input}")
        print(f"我发送密文:{server_encrypted}")
        conn.send(server_encrypted.encode("utf-8"))

        if server_input == "exit":
            break

    conn.close()
    server_socket.close()

if __name__ == "__main__":
    main()

<4> 运行测试
先启动服务端,再运行客户端,成功建立TCP连接;
双向发送文字内容,密文正常传输、解密无误;
输入exit可正常结束通信、关闭套接字;
截图保存双方运行界面,通信稳定无乱码、无断开异常。
客户端:
屏幕截图 2026-04-28 140942
服务端:
屏幕截图 2026-04-28 141109
2.2 LLM生成图形界面程序
2.2.1 GUI 程序代码
功能:
TCP 客户端 + 服务端合一
同样ASCII 偏移 + 5 加密,和控制台代码加密完全一致、互通
图形化窗口、消息展示、明文 / 密文同时显示

# 本图形化程序由LLM大模型自动生成
# 实验三 一体化TCP加密聊天GUI
# 加密规则:ASCII偏移 +5 / -5
import socket
import threading
import tkinter
from tkinter import scrolledtext

# 统一加密偏移量
KEY_NUM = 5

# LLM生成加密函数
def encryption(original_text):
    result = ""
    for char in original_text:
        code = ord(char)
        new_code = code + KEY_NUM
        result = result + chr(new_code)
    return result

# LLM生成解密函数
def decryption(secret_text):
    result = ""
    for char in secret_text:
        code = ord(char)
        new_code = code - KEY_NUM
        result = result + chr(new_code)
    return result

class ChatProgram:
    def __init__(self, root):
        self.root = root
        self.root.title("Socket加密聊天|LLM生成一体化程序")
        self.root.geometry("720x530")

        self.sock = None
        self.link = None

        # IP端口区域
        tkinter.Label(root, text="IP地址:").place(x=15, y=18)
        self.ip_var = tkinter.Entry(width=25)
        self.ip_var.place(x=75, y=18)

        tkinter.Label(root, text="端口:").place(x=260, y=18)
        self.port_var = tkinter.Entry(width=12)
        self.port_var.place(x=310, y=18)
        self.port_var.insert(0, "4444")

        # 一键服务端 / 客户端
        tkinter.Button(root, text="开启服务端", command=self.create_server, bg="#ccebff").place(x=400, y=15)
        tkinter.Button(root, text="连接客户端", command=self.create_client, bg="#dcf8dc").place(x=520, y=15)

        # 聊天显示区
        self.show_area = scrolledtext.ScrolledText(root, width=85, height=22)
        self.show_area.place(x=15, y=55)
        self.show_area.config(state="disabled")

        # 发送输入
        self.input_box = tkinter.Entry(width=75, font=("微软雅黑",10))
        self.input_box.place(x=15, y=485)
        tkinter.Button(root, text="发送消息", command=self.send_message, bg="#ffdede").place(x=600, y=482)

    # 日志输出
    def add_log(self, msg):
        self.show_area.config(state="normal")
        self.show_area.insert("end", msg + "\n")
        self.show_area.config(state="disabled")
        self.show_area.see("end")

    # 创建服务端
    def create_server(self):
        ip = self.ip_var.get()
        port = int(self.port_var.get())
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.bind((ip, port))
        self.sock.listen(1)
        self.add_log("✅ 服务端已启动,等待连接中...")
        threading.Thread(target=self.accept_link, daemon=True).start()

    def accept_link(self):
        self.link, addr = self.sock.accept()
        self.add_log(f"✅ 已接入客户端:{addr}")
        threading.Thread(target=self.receive_data, daemon=True).start()

    # 连接客户端
    def create_client(self):
        ip = self.ip_var.get()
        port = int(self.port_var.get())
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect((ip, port))
        self.link = self.sock
        self.add_log("✅ 成功连接服务端")
        threading.Thread(target=self.receive_data, daemon=True).start()

    # 持续接收
    def receive_data(self):
        while True:
            try:
                secret_msg = self.link.recv(1024).decode("utf-8")
                plain_msg = decryption(secret_msg)
                self.add_log(f"对方明文:{plain_msg}")
                self.add_log(f"对方密文:{secret_msg}\n")
            except:
                self.add_log("❌ 连接已断开")
                break

    # 发送加密消息
    def send_message(self):
        text = self.input_box.get().strip()
        if not text:
            return
        secret = encryption(text)
        self.link.send(secret.encode("utf-8"))
        self.add_log(f"我方明文:{text}")
        self.add_log(f"我方密文:{secret}\n")
        self.input_box.delete(0, "end")

if __name__ == "__main__":
    window = tkinter.Tk()
    app = ChatProgram(window)
    window.mainloop()

2.2.2 运行结果:
服务端:
屏幕截图 2026-04-29 183748
客户端:
屏幕截图 2026-04-29 184145
2.2.3 关键代码功能分析:
Socket 网络模块使用socket.AF_INET、SOCK_STREAM创建 TCP 流式套接字,分别实现服务端bind()、listen()、accept()监听流程与客户端connect()主动连接,完成局域网两台主机 TCP 通信。
加解密函数沿用实验统一 ASCII 偏移加密,encrypt将字符 ASCII 码 + 5 加密,decrypt减 5 解密,与控制台版本加密规则完全一致,保证双向互通。
多线程 threading使用子线程单独运行消息接收循环,避免 GUI 界面卡顿,实现收发消息互不阻塞。
tkinter 图形组件使用输入框、滚动文本域、功能按钮搭建可视化界面,实时展示明文 + 密文,满足实验加密显示要求。
消息收发逻辑发送前自动加密,接收后自动解密,界面分栏打印明文与密文,输入exit可断开连接。
LLM 生成程序优点:
基于 Python 内置 tkinter 开发,无需安装第三方库,兼容性强,Windows、Linux 均可直接运行。
图形化操作简单直观,对比控制台黑框界面更加人性化,交互体验更好。
采用多线程处理网络接收,不会造成窗口卡死,程序稳定性高。
加密算法与传统控制台实验代码完全统一,可无缝互通,满足实验互通要求。
代码结构清晰、模块化设计,易阅读、易修改,符合程序设计规范。
2.3 代码托管到gitee:

屏幕截图 2026-05-14 163457

SockeServer.py
** 3. 实验过程中遇到的问题和解决过程**
问题 1:大模型初始生成的 GUI 代码将服务端、客户端写在同一个程序中,不符合实验要求两端独立分开的规范。
解决方案:对 LLM 生成代码进行拆分重构,分离为独立的 GUI 服务端、GUI 客户端两个文件,结构符合实验标准。
问题 2:GUI 程序单线程运行时,接收消息会阻塞界面,导致窗口卡顿、无响应。
解决方案:引入threading多线程,将消息接收循环放置子线程运行,保证界面操作与网络接收互不阻塞。
问题 3:AI 生成的初始 GUI 加密逻辑不统一,无法与控制台版 Socket 程序互通加密消息。
解决方案:统一替换为本次实验固定ASCII 偏移 + 5加解密算法,保证控制台程序与 GUI 程序密文互通、解密正常。
问题 4:图形界面初次运行时,IP、端口需要手动输入,容易输入错误导致连接失败。
解决方案:在代码内预设好本次实验固定 IP 与端口,减少手动输入错误,提升连接成功率。
问题 5:由于时间限制,本次实验未实现文件操作功能。
解决方案:后续可添加日志记录功能,将通信内容保存到本地文件,方便审计和回溯。

参考资料

《程序设计与数据结构教程(第二版)》

《程序设计与数据结构教程(第二版)》学习指导

...

posted @ 2026-04-29 19:01  向家沣  阅读(16)  评论(3)    收藏  举报