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

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

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

1.实验内容

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

  • 创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;

  • 要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。

  • 程序代码托管到码云。

  • 添加文件操作

(2)使用LLM生成一个带图形界面的程序

2. 实验过程及结果

注:通信双方为20252415陈至晟和20252403李俊江
2.1.1创建服务端和客户端(包括文件操作功能)
服务端代码:SocketServer

# -*- coding: utf-8 -*-
# File            :  SocketServer.py
# Author          :  无忆江南
# Create Time     :  2026/4/27 19:05
# Python Version  :  3.18.12
# "    ————when it is dark enough ,we can see the stars."

import socket


def encrypt(plain):
    return "".join(chr(ord(c) + 3) for c in plain)

def decrypt(cipher):
    return "".join(chr(ord(c) - 3) for c in cipher)


def save_log(msg):
    with open("chat_log.txt", "a", encoding="utf-8") as f:
        f.write(msg + "\n")


server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "192.168.92.15"
PORT = 8888
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind((HOST, PORT))
server.listen(5)
print("server is listening...")

conn, addr = server.accept()
print(f"客户端已连接: {addr}")
save_log("===== 服务端启动,客户端连接成功 =====")

while True:
   
    cipher_data = conn.recv(1024).decode("utf-8")
    if not cipher_data or cipher_data.lower() == "quit":
        print("客户端断开连接")
        save_log("客户端断开连接")
        break

  
    plain_data = decrypt(cipher_data)
    print(f"\n【接收】明文:{plain_data}")
    print(f"【接收】密文:{cipher_data}")

    
    save_log(f"[客户端] 明文:{plain_data} | 密文:{cipher_data}")

  
    reply_plain = input("请输入回复内容:")
    reply_cipher = encrypt(reply_plain)
    conn.send(reply_cipher.encode("utf-8"))

    print(f"【发送】明文:{reply_plain}")
    print(f"【发送】密文:{reply_cipher}")
    save_log(f"[服务端] 明文:{reply_plain} | 密文:{reply_cipher}")

    if reply_plain.lower() == "quit":
        print("服务端结束对话")
        save_log("服务端结束对话")
        break

conn.close()
server.close()

客户端代码:SocketClent

# -*- coding: utf-8 -*-

# File            :  SocketClent .py
# Author          :  无忆江南
# Create Time     :  2026/4/27 19:18
# Python Version  :  3.18.12
# "    ————when it is dark enough ,we can see the stars."

import socket

def encrypt(plain):
    return "".join(chr(ord(c) + 3) for c in plain)

def decrypt(cipher):
    return "".join(chr(ord(c) - 3) for c in cipher)

def save_log(msg):
    with open("chat_log.txt", "a", encoding="utf-8") as f:
        f.write(msg + "\n")

HOST = "192.168.92.15"
PORT = 8888

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((HOST, PORT))
print("已连接服务端")
save_log("===== 客户端已连接 =====")

while True:
    send_plain = input("\n请输入发送内容:")
    send_cipher = encrypt(send_plain)

    print(f"【发送】明文:{send_plain}")
    print(f"【发送】密文:{send_cipher}")
    save_log(f"[客户端] 明文:{send_plain} | 密文:{send_cipher}")

    client.send(send_cipher.encode("utf-8"))

    if send_plain.lower() == "quit":
        print("客户端退出")
        save_log("客户端退出")
        break

    recv_cipher = client.recv(1024).decode("utf-8")
    recv_plain = decrypt(recv_cipher)

    print(f"【接收】明文:{recv_plain}")
    print(f"【接收】密文:{recv_cipher}")
    save_log(f"[服务端] 明文:{recv_plain} | 密文:{recv_cipher}")

client.close()

2.1.2双方通讯截图
(1)我作为客户端

屏幕截图 2026-05-09 152241

(2)我作为服务端

屏幕截图 2026-05-09 152554

(3)使用云服务器我作为服务端

屏幕截图 2026-05-09 160925

(4)使用云服务器我作为客户端

屏幕截图 2026-05-09 161406

2.1.3代码托管至码云

2.2使用LLM生成一个带图形界面的程序
2.2.1分析关键代码的功能和使用方法
(1)通用加密解密模块:发送方调用caesar_encrypt(明文)加密后传输;接收方调用caesar_decrypt(密文)还原明文。

# 加密:所有字符Unicode编码移位+3
def caesar_encrypt(text, shift=3):
    encrypted = ""
    for char in text:
        encrypted += chr(ord(char) + shift)
    return encrypted

# 解密:密文字符Unicode编码移位-3
def caesar_decrypt(text, shift=3):
    decrypted = ""
    for char in text:
        decrypted += chr(ord(char) - shift)
    return decrypted

(2)TCP Socket 通信模块:服务端输入端口点击“启动监听”;客户端输入服务端IP和端口,点击“连接”。

# 服务端:创建套接字、绑定端口、监听
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(("0.0.0.0", port))
self.server_socket.listen(5)

# 客户端:创建套接字、连接服务端
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((ip, port))

(3)图形化界面(GUI)模块

# 构建主窗口
self.root = tk.Tk()
self.root.title("TCP 服务端(加密通信+文件传输)")
self.root.geometry("750x700")

# 核心组件
self.port_entry = ttk.Entry(top_frame, width=10)
self.send_entry = ttk.Entry(send_frame, width=40)
self.msg_text = scrolledtext.ScrolledText(self.root, width=90, height=35)
self.start_btn = ttk.Button(top_frame, text="启动监听", command=self.start_server)

(4)文本消息收发模块:输入明文,点击“发送加密消息”;接收方自动解密并显示。

# 发送文本(加密传输)
def send_to_client(self):
    plain_text = self.send_entry.get().strip()
    cipher_text = caesar_encrypt(plain_text)
    client_sock.send(cipher_text.encode("utf-8"))

# 接收文本(解密显示)
def handle_client(self, client_sock, addr):
    data = client_sock.recv(4096).decode("utf-8")
    plain_text = caesar_decrypt(data)
    self.log(f"📩 收到 {addr} 密文:{data}")
    self.log(f"🔓 解密后明文:{plain_text}\n")

(5)文件加密传输模块:点击“选择并发送文件”选择本地文件,接收方自动解密保存。

# 发送文件(加密传输)
def send_file(self):
    file_path = filedialog.askopenfilename()
    filename = file_path.split("/")[-1].split("\\")[-1]
    with open(file_path, "r", encoding="utf-8") as f:
        plain_content = f.read()
    cipher_content = caesar_encrypt(plain_content)
    send_data = f"FILE:{filename}:{cipher_content}"
    client_sock.send(send_data.encode("utf-8"))

# 接收文件(解密保存)
def handle_client(self, client_sock, addr):
    if data.startswith("FILE:"):
        _, filename, cipher_content = data.split(":", 2)
        plain_content = caesar_decrypt(cipher_content)
        save_path = f"接收_服务端_{filename}"
        with open(save_path, "w", encoding="utf-8") as f:
            f.write(plain_content)

2.2.2优点
(1) 功能完整
涵盖TCP多客户端、GUI、双向加密、明文密文双显示、文件传输,支持中文无乱码。
(2)操作便捷
全图形化操作,无需复杂命令,新手可快速上手。
(3)加密适配性强
Unicode全域移位加密,支持所有字符,算法简单,适合学习演示。
(4) 通信稳定
基于TCP协议,数据传输无丢包、不重复,保障解密和文件完整性。
(5) 并发性能优
多线程设计,GUI不卡顿,支持多客户端同时通信。
(6)无依赖跨平台
纯Python内置库实现,无需额外安装,支持多操作系统。
(7) 日志可视化
实时显示操作过程。
2.2.3运行过程和结果截图
(1)自行连接

  • 服务端

屏幕截图 2026-05-08 182013

  • 客户端

image
(2)同学互相连接

  • 服务端

屏幕截图 2026-05-09 153014

  • 客户端

屏幕截图 2026-05-09 152931

2.2.4 程序代码托管到码云

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

  • 问题1:联机总是失败
  • 问题1解决方案:检查网络是否同一个,ip地址是否更改
  • 问题2:使用凯撒加密函数时输入中文加解密后出现乱码
  • 问题2解决方案:查询后得知原来的凯撒加密只处理英文字母(char.isalpha()判断),中文的ord()值远大于英文字母,导致移位计算出错,解密后变成乱码。修改为Unicode移位加密:取每个字符的 Unicode 编码直接 +3。

其他(感悟、思考等)

记得检查防火墙和云服务器安全组规则设置

posted @ 2026-05-09 16:29  无忆江南  阅读(25)  评论(0)    收藏  举报