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)关键代码功能分析

  1. 加密解密功能
    encode_message / cipher_encode:字符移位加密函数,将每个字符的 ASCII 码 +2,实现简单凯撒加密。
    decode_message / cipher_decode:字符移位解密函数,将每个字符的 ASCII 码 -2,还原原始消息。
    作用:让网络传输的数据不再是明文,提升信息安全性。
  2. 套接字创建(服务端 + 客户端)
    socket.socket(AF_INET, SOCK_STREAM):创建基于 IPv4 的 TCP 流式套接字,是网络通信的基础。
    服务端:bind() 绑定 IP 和端口,listen() 监听连接,accept() 等待客户端接入。
    客户端:connect() 主动连接服务端,建立通信通道。
  3. 消息收发功能
    recv(1024):接收对方发送的加密数据,最大长度 1024 字节。
    send():将加密后的消息发送给对方。
    encode / decode("utf-8"):实现字符串与字节流的转换,保证网络传输正常。
  4. 聊天循环与退出机制
    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)实现功能截图:image
(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

posted @ 2026-05-08 17:19  花间且晚钟  阅读(13)  评论(0)    收藏  举报