20241204 2025-2026-2 《Python程序设计》实验3报告
20241204 2025-2026-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2412
姓名: 李浩铭
学号:20241204
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课
1.实验内容
1.1实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
1.2实验要求
注意事项:
每人必须做一次客户端和一次服务端,且要和队友(20241226张耀)互相通信。
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。
(3)程序代码托管到码云。
(4)添加文件操作,有加分。(可选项)
要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析生成程序的优点
(3)给出运行过程和结果截图
(4)程序代码托管到码云。
2. 实验过程及结果
2.1创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和密文
(1)服务端代码:
import socket
def encode_message(info):
cipher = ""
for char in info:
cipher += chr(ord(char) + 2)
return cipher
def decode_message(info):
plain = ""
for char in info:
plain += chr(ord(char) - 2)
return plain
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "127.0.0.1"
PORT = 8888
tcp_server.bind((HOST, PORT))
tcp_server.listen(1)
print("服务端已启动,等待客户端连接...")
client_socket, client_addr = tcp_server.accept()
print(f"客户端 {client_addr} 已连接")
while True:
recv_cipher = client_socket.recv(1024).decode("utf-8")
recv_plain = decode_message(recv_cipher)
if not recv_plain or recv_plain == "exit":
print("对方已退出,聊天结束")
break
print(f"客户端发来密文:{recv_cipher}")
print(f"客户端发来明文:{recv_plain}")
send_plain = input("我:")
send_cipher = encode_message(send_plain)
client_socket.send(send_cipher.encode("utf-8"))
if send_plain == "exit":
print("已主动退出聊天")
break
client_socket.close()
tcp_server.close()
服务端代码功能:本地 TCP 服务端,实现简单移位加密的点对点聊天,支持收发、退出、显式密文明文。
(2)客户端代码:
import socket
def cipher_encode(msg):
cipher_text = ""
for char in msg:
cipher_text += chr(ord(char) + 2)
return cipher_text
def cipher_decode(msg):
plain_text = ""
for char in msg:
plain_text += chr(ord(char) - 2)
return plain_text
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
SERVER_IP = "127.0.0.1"
SERVER_PORT = 8888
tcp_client.connect((SERVER_IP, SERVER_PORT))
print("成功连接到服务端,输入 exit 即可退出聊天")
while True:
send_content = input("我:")
send_encrypted = cipher_encode(send_content)
print(f"发送明文:{send_content}")
print(f"发送密文:{send_encrypted}")
tcp_client.send(send_encrypted.encode("utf-8"))
if send_content == "exit":
break
recv_encrypted = tcp_client.recv(1024).decode("utf-8")
if not recv_content or recv_content == "exit":
print("聊天已结束")
break
print(f"服务端密文:{recv_encrypted}")
print(f"服务端明文:{recv_content}")
tcp_client.close()
客户端代码功能:TCP 加密聊天客户端:连接服务端,字符移位加解密收发消息,显示明文密文,输入 exit 退出。
(3)关键代码功能分析
- 加密解密功能
encode_message / cipher_encode:字符移位加密函数,将每个字符的 ASCII 码 +2,实现简单凯撒加密。
decode_message / cipher_decode:字符移位解密函数,将每个字符的 ASCII 码 -2,还原原始消息。
作用:让网络传输的数据不再是明文,提升信息安全性。 - 套接字创建(服务端 + 客户端)
socket.socket(AF_INET, SOCK_STREAM):创建基于 IPv4 的 TCP 流式套接字,是网络通信的基础。
服务端:bind() 绑定 IP 和端口,listen() 监听连接,accept() 等待客户端接入。
客户端:connect() 主动连接服务端,建立通信通道。 - 消息收发功能
recv(1024):接收对方发送的加密数据,最大长度 1024 字节。
send():将加密后的消息发送给对方。
encode / decode("utf-8"):实现字符串与字节流的转换,保证网络传输正常。 - 聊天循环与退出机制
while True:实现持续双向聊天。
判断 exit:输入退出指令可安全关闭连接,避免程序异常。
连接关闭:close() 正常关闭套接字,释放资源。
(4)程序优点
1.结构清晰,模块化强
加密、解密、网络通信分开编写,代码易读、易修改、易调试,非常适合学习理解。
2.实现完整 TCP 聊天功能
包含服务端监听、客户端连接、双向收发、退出处理,流程完整、可直接运行。
3.具备基础安全加密功能
使用移位加密避免明文传输,体现信息安全思想,能有效隐藏聊天内容。
4.不依赖第三方库,轻量可移植
仅使用 Python 内置 socket 库,跨 Windows/Linux 运行,修改 IP 即可在局域网内使用。
5.交互友好,便于观察效果
实时显示明文与密文,能直观看到加密前后的变化,适合教学与实验演示。
6.逻辑稳定,异常处理完善
支持正常退出、连接断开判断,程序运行稳定,不易崩溃
(5)与队友合作的截图
我作为服务端:![a3f698e848e0c0e4298d5306a53479df]()
我作为客户端:![e190b3221580f88b936f0db1506412c8]()
(6)代码托管到码云
服务端代码:https://gitee.com/qingfeng-pu/PythonProject5/blob/master/实验三服务端.py
客户端代码:https://gitee.com/qingfeng-pu/PythonProject5/blob/master/实验三客户端.py
2.2使用LLM生成一个带图形界面的程序
(1)服务端:
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext
def encode_message(info):
return ''.join(chr(ord(char) + 2) for char in info)
def decode_message(info):
return ''.join(chr(ord(char) - 2) for char in info)
client_socket = None
接收客户端消息
def recv_data():
global client_socket
while True:
try:
recv_cipher = client_socket.recv(1024).decode("utf-8")
recv_plain = decode_message(recv_cipher)
if recv_plain == "exit" or not recv_plain:
chat_box.insert(tk.END, "客户端已退出聊天\n")
client_socket.close()
break
chat_box.insert(tk.END, f"客户端密文:{recv_cipher}\n")
chat_box.insert(tk.END, f"客户端明文:{recv_plain}\n\n")
except:
break
def send_data():
msg = input_entry.get().strip()
if not msg:
return
cipher = encode_message(msg)
chat_box.insert(tk.END, f"我明文:{msg}\n")
chat_box.insert(tk.END, f"我密文:{cipher}\n\n")
if client_socket:
client_socket.send(cipher.encode("utf-8"))
input_entry.delete(0, tk.END)
if msg == "exit":
root.quit()
def start_server():
global client_socket
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
HOST = "127.0.0.1"
PORT = 8888
tcp_server.bind((HOST, PORT))
tcp_server.listen(1)
chat_box.insert(tk.END, "服务端已启动,等待客户端连接...\n")
client_socket, addr = tcp_server.accept()
chat_box.insert(tk.END, f"客户端 {addr} 已连接\n\n")
threading.Thread(target=recv_data, daemon=True).start()
root = tk.Tk()
root.title("加密聊天-服务端")
root.geometry("550x500")
chat_box = scrolledtext.ScrolledText(root, width=70, height=22)
chat_box.pack(pady=10)
input_entry = tk.Entry(root, width=60, font=("微软雅黑",10))
input_entry.pack(pady=5)
send_btn = tk.Button(root, text="发送", command=send_data, width=10)
send_btn.pack()
threading.Thread(target=start_server, daemon=True).start()
root.mainloop()
(2)客户端代码:
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext
def cipher_encode(msg):
return ''.join(chr(ord(char) + 2) for char in msg)
def cipher_decode(msg):
return ''.join(chr(ord(char) - 2) for char in msg)
def recv_data(client):
while True:
try:
recv_encrypted = client.recv(1024).decode("utf-8")
recv_content = cipher_decode(recv_encrypted)
if recv_content == "exit" or not recv_content:
chat_box.insert(tk.END, "服务端已退出聊天\n")
break
chat_box.insert(tk.END, f"服务端密文:{recv_encrypted}\n")
chat_box.insert(tk.END, f"服务端明文:{recv_content}\n\n")
except:
break
def send_data(client):
msg = input_entry.get().strip()
if not msg:
return
send_encrypted = cipher_encode(msg)
chat_box.insert(tk.END, f"我明文:{msg}\n")
chat_box.insert(tk.END, f"我密文:{send_encrypted}\n\n")
client.send(send_encrypted.encode("utf-8"))
input_entry.delete(0, tk.END)
if msg == "exit":
root.quit()
root = tk.Tk()
root.title("加密聊天-客户端")
root.geometry("550x500")
chat_box = scrolledtext.ScrolledText(root, width=70, height=22)
chat_box.pack(pady=10)
input_entry = tk.Entry(root, width=60, font=("微软雅黑",10))
input_entry.pack(pady=5)
send_btn = tk.Button(root, text="发送", command=lambda: send_data(tcp_client), width=10)
send_btn.pack()
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_client.connect(("127.0.0.1", 8888))
chat_box.insert(tk.END, "成功连接服务端!\n\n")
threading.Thread(target=recv_data, args=(tcp_client,), daemon=True).start()
root.mainloop()
(3)实现功能截图:
(4)关键代码功能与使用方法
加解密函数:每个字符 ASCII 值 ±2 实现简易移位加密;发送加密、接收解密,自动转换明文密文。
Socket 网络编程:服务端绑定端口、监听等待连接;客户端主动连接指定 IP 和端口,基于 TCP 点对点通信。
Tkinter 图形组件:滚动文本框展示聊天记录、输入框输消息、按钮触发发送,替代控制台黑窗口。
多线程 threading:单独线程后台接收消息,避免界面卡死,收发消息可同时进行。
退出机制:输入exit发送后自动关闭窗口与网络连接,正常结束聊天。
(5)程序优点
1.服务端、客户端完全分离,两个独立文件,互不干扰。
2.图形化界面,操作直观,无需命令行输入。
3.自带加解密,实时显示明文、密文,适合课程学习演示。
4.多线程不卡顿,聊天界面流畅,收发互不阻塞。
5.无需额外安装库,Python 自带 socket、tkinter,直接运行。
6.封装完整,结构清晰,易修改端口、IP 或加密规则。
(6)LLM程序托管到码云
服务端代码:https://gitee.com/qingfeng-pu/PythonProject6/blob/master/LLM服务端.py
客户端代码:https://gitee.com/qingfeng-pu/PythonProject6/blob/master/LLM客户端.py
3. 实验过程中遇到的问题和解决过程
- 问题1:与队友进行服务端与客户端连接时一开始连接不上
- 问题1解决方案:通过链接同一热点尝试多次成功连接,并成功发送,显示明文和密文
其他(感悟、思考等)
感悟:本次完成 Python Socket TCP 加密聊天程序实验,让我将计算机网络与 Python 编程知识结合起来,收获良多。
我熟悉了 TCP 服务端与客户端的搭建流程,学习了套接字创建、绑定端口、监听连接、数据收发等核心操作,理解了 IP 地址和端口在局域网通信中的作用。同时通过字符移位实现简单的加解密,直观体会到网络传输中明文传输的安全隐患,也初步认识了对称移位加密的基本原理。实验过程中,我遇到过端口配置、编码转换、收发消息逻辑顺序等问题,通过调试代码逐一解决,提升了代码排错和动手实践能力。也发现简易移位加密安全性较弱,只能用于基础信息隐藏,实际网络通信需要更成熟的加密算法。这次实验让我明白了理论与实践结合的重要性,加深了对 TCP 协议、网络编程和信息安全的理解,也为后续学习网络通信与加密技术打下了良好基础。
参考资料
Python官方文档-socket模块https://blog.csdn.net/qq_42967398/article/details/105326616



浙公网安备 33010602011771号