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

课程:《Python程序设计》
班级: 2432
姓名: 赵怡喆
学号:20243213
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课

1.实验内容
(一)实验内容

(1.)使用 Python 语言基于 TCP Socket 实现服务端与客户端网络通信程序

(2.)实现明文输入→加密传输→接收解密功能,收发双方同时显示明文与密文

(3.)加入文件操作,自动保存聊天记录到本地文件

(4.)实现安全退出功能,支持关闭套接字与释放资源

(5.)使用 LLM 生成图形界面(GUI)版本,实现可视化加密聊天

(6.)在 Windows 物理机上完成服务端与客户端通信,并与队友(学号:20252230,姓名:刘畅)互相通信

(7.)将所有代码托管至码云平台以下是该代码的测试

二、实验环境

1. 操作系统:Windows 10/11

2. 开发工具:Python 3.8及以上版本

3. 核心库:socket(网络通信)、threading(多线程)、tkinter(图形界面)

4. 网络环境:同一局域网(共享热点/局域网),确保设备IP互通

三、实验原理

1. TCP Socket通信原理

TCP是面向连接、可靠的传输层协议,通信流程分为服务端和客户端:

服务端:创建套接字→绑定IP和端口→监听连接→接受客户端连接→数据收发→关闭连接;

客户端:创建套接字→连接服务端→数据收发→关闭连接。

本实验采用TCP协议保证数据传输的稳定性与完整性。

2. 异或加密算法原理

异或加密是一种对称加密算法。加密与解密使用同一函数和密钥,具有实现简单、运算高效的特点,适合轻量级通信加密场景。

3. 多线程原理

服务端采用多线程技术,主线程负责监听客户端连接,子线程独立处理每个客户端的消息收发,避免单线程阻塞,支持同时处理多个客户端连接。

4. 文件操作原理

通过Python文件IO操作,将通信过程中的明文、密文数据实时写入文本文件,实现聊天记录的自动持久化存储,支持数据追溯。

四、实验内容与步骤

(一)核心功能模块设计

1. 加密解密模块:基于异或算法实现统一的加密、解密函数,服务端与客户端共用相同密钥。

2. TCP服务端模块:绑定IP与端口,多线程监听客户端连接,接收密文解密、加密回复消息。

3. TCP客户端模块:主动连接服务端,加密发送消息、接收密文并解密显示。

4. 文件记录模块:自动将通信的明文、密文写入本地文本文件,实时刷新保存。

5. 安全退出模块:支持输入exit指令安全关闭程序,释放套接字与文件资源。

6. GUI图形界面模块:基于Tkinter开发独立的服务端、客户端图形界面,实现可视化通信。

(二)实验运行步骤

1. 网络

将实验设备连接至同一热点/局域网,关闭Windows防火墙或放行9999端口,确保设备间网络互通。

2. 命令行版本测试

① 运行服务端程序,绑定局域网IP与4444端口,启动监听;

② 运行客户端程序,输入服务端IP完成连接;

③ 双方输入消息进行加密收发,查看明文、密文显示效果;

④ 输入`exit`指令,测试安全退出功能。

0f06830c9e9265d8589bc72f540d9881

ded553b7ac01c520e905cff65f5612e4

3. GUI版本测试

分别运行GUI服务端、GUI客户端程序,通过图形界面完成消息收发、退出操作,验证界面交互与通信功能。

1cfd051537accc24dcb6712f24d7d65e

3533062d3ba6e6aeec677a5e4a177a90

4. 跨机通信测试

与队友设备连接同一局域网,使用对方设备IP进行连接,实现跨机加密通信。

98c12741488b38327ba958ad9f62adfc

5. 功能验证

查看自动生成的聊天记录文本文件,验证文件保存功能的完整性。

  1. 提交到码云

五、核心代码实现

(发送方)

Have you ever seen Los Angeles at 4 a.m?

import socket

import os

def encrypt(message, key):

encrypted = []

key_length = len(key)

for i, char in enumerate(message):

encrypted_char = chr(ord(char) ^ ord(key[i % key_length]))

encrypted.append(encrypted_char)

return ''.join(encrypted).encode()

def decrypt(ciphertext, key):

return encrypt(ciphertext.decode(), key).decode()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

HOST = "192.168.43.5"

PORT = 4445

key = os.urandom(16).decode('latin-1')

server.bind((HOST, PORT))

server.listen(5)

print("服务端已经启动,等待客户端连接......")

print(f"服务器地址:{HOST}:{PORT}")

while True:

conn, addr = server.accept()

print(f"已连接客户端:{addr}")

conn.send(key.encode('latin-1'))

print("已发送加密密钥给客户端")

try:

while True:

encrypted_data = conn.recv(1024)

if not encrypted_data:

print(f"客户端 {addr} 断开连接")

break

data = decrypt(encrypted_data, key)

if data == "exit":

print(f"客户端 {addr} 退出聊天")

break

print(f"客户端 {addr}(明文):{data}")

print(f"客户端 {addr}(密文):{encrypted_data.hex()}")

send_msg = input("我:")

encrypted_msg = encrypt(send_msg, key)

conn.send(encrypted_msg)

print(f"我(明文):{send_msg}")

print(f"我(密文):{encrypted_msg.hex()}")

if send_msg == "exit":

break

except Exception as e:

print(f"与客户端 {addr} 通信时发生错误:{e}")

finally:

conn.close()

server.close()

另一方

Have you ever seen Los Angeles at 4 a.m?

import socket

def encrypt(message, key):

encrypted = []

key_length = len(key)

for i, char in enumerate(message):

encrypted_char = chr(ord(char) ^ ord(key[i % key_length]))

encrypted.append(encrypted_char)

return ''.join(encrypted).encode()

def decrypt(ciphertext, key):

return encrypt(ciphertext.decode(), key).decode()

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

HOST = "192.168.43.5" # 服务器的IP地址

PORT = 4445

client.connect((HOST, PORT))

print("已连接服务端!输入exit退出聊天!")

key = client.recv(16).decode('latin-1')

print("已接收加密密钥")

while True:

# 发送数据

send_msg = input("我:")

encrypted_msg = encrypt(send_msg, key)

client.send(encrypted_msg)

print(f"我(明文):{send_msg}")

print(f"我(密文):{encrypted_msg.hex()}")

if send_msg == "exit":

break

encrypted_data = client.recv(1024)

if not encrypted_data:

print("聊天结束")

break

data = decrypt(encrypted_data, key)

if data == "exit":

print("聊天结束")

break

print(f"\n服务端(明文):{data}")

print(f"服务端(密文):{encrypted_data.hex()}")

client.close()

六、实验过程问题与解决方案

1 服务端报错:`OSError: [WinError 10049] 地址无效` : 绑定IP非本机真实IP,将服务端IP改为`0.0.0.0`或本机局域网静态IP

2. GUI版本无法同时打开服务端和客户端窗口 : 将二合一GUI拆分为独立的服务端、客户端文件,分别运行实现双端通信

3. 客户端连接超时,跨机通信失败 :关闭Windows防火墙,确保设备在同一局域网

4. 关闭程序时报错,套接字资源未释放 :完善安全退出逻辑,退出时主动关闭套接字和文件,释放系统资源

七、实验结果

1. 通信功能:服务端成功启动并监听端口,客户端可正常连接,双向消息收发稳定无异常。

2. 加密功能:消息传输全程采用异或加密,发送方显示明文+密文,接收方自动解密显示,加密解密效果符合预期。

3. 多线程功能:服务端支持并发处理多个客户端连接,无阻塞、无卡顿。

4. 文件存储:自动生成`chat_history_server.txt`和`chat_history_client.txt`文件,完整保存所有通信的明文与密文。

八、程序优缺点分析

(一)优点

1. 功能完整:集成TCP通信、异或加密、多线程、文件存储、GUI界面等核心功能,满足实验全部要求。

2. 易用性强:提供命令行与图形化双版本,图形界面无需命令行操作,适合新手使用。

3. 安全性:采用异或加密传输消息,避免明文传输导致的数据泄露。

4. 稳定性高:完善的异常处理与安全退出机制,程序运行稳定,资源释放及时。

5. 跨平台性:代码可在Windows、Linux等系统运行,适配多种环境。

6. 实用性:自动保存聊天记录,支持数据追溯,符合实际应用场景需求。

(二)不足

1. 异或加密为基础对称加密算法,安全性有限,不适合高安全要求的通信场景。

2. 服务端仅支持文本消息传输,未实现文件、图片等多媒体数据传输功能。

3. GUI界面设计较为简洁,未添加消息历史滚动、用户昵称等拓展功能。

九、实验感悟与思考

通过本次实验,我系统掌握了Python TCP Socket网络编程的完整流程,深入理解了服务端与客户端的通信原理,熟练实现了连接建立、数据收发、连接关闭等核心操作。同时,我掌握了异或加密算法的实现与应用,深刻体会到数据加密在网络通信中的重要性。

多线程技术的应用让我解决了程序阻塞问题,提升了对并发编程的理解;文件操作与GUI界面开发,让我学会了数据持久化与图形化交互的实现方法。实验过程中,我独立排查了IP配置、防火墙、端口拦截等网络故障,掌握了局域网通信的调试技巧。

本次实验不仅提升了我的编程与调试能力,更让我认识到代码规范、资源释放、异常处理的重要性。未来可对程序进行优化,采用更安全的加密算法,拓展多媒体传输功能,完善界面设计,让程序更贴合实际应用需求。

posted on 2026-04-29 21:03  zyz66666666  阅读(13)  评论(0)    收藏  举报