20254212 2025-2026-2 《Python程序设计》实验3报告
课程:《Python程序设计》
班级: 2542
姓名: 张弛
学号:20254212
实验教师:王志强
实验日期:2026年4月28日
必修/选修:专选课
1.实验内容
(1)实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(2)实验要求
注意事项:每人必须做一次客户端和一次服务端,且要和队友(标注学号姓名)互相通信。
要求1:
①创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
②要求发送方输入内容,并传输;接收方收到信息并显示。
要求2:使用LLM生成一个带图形界面的程序
①分析关键代码的功能和使用方法
②分析生成程序的优点
③给出运行过程和结果截图
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
2. 实验过程及结果
(1)按照课上程序进行试验:
修改自己的IP地址:
教室网络不知为何很卡,连上个人热点:)

修改ip地址,后两位改为学号

创建客户端,20254212张弛192.168.1.12(客户端)与20254226黄婉婷(服务端)进行通讯
代码如下


创建服务端,20254212张弛192.168.1.12(服务端)与20254226黄婉婷192.168.1.26(客户端)进行通讯
代码如下屏幕截图 2026-05-10 231751.png
99e50ac353b5a72fba772b8980ad0031.png
99e50ac353b5a72fba772b8980ad0031.png

(2)使用LLM生成一个带图形界面的程序:
给出运行过程和结果截图:
程序:
分别为客户端和服务端程序
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, Entry, Button
# ========== 在这里改自己和队友信息 ==========
KEY = 123
IP = '0.0.0.0'
PORT = 8888
# 服务端 姓名学号
SERVER_NAME = "队友名字"
SERVER_ID = "队友学号"
# ==========================================
# 简单加解密
def encrypt(text):
return ''.join([chr(ord(c) ^ KEY) for c in text])
def decrypt(text):
return ''.join([chr(ord(c) ^ KEY) for c in text])
class ServerGUI:
def __init__(self, root):
self.root = root
self.root.title(f"服务端 | {SERVER_NAME}({SERVER_ID})")
self.chat_area = scrolledtext.ScrolledText(root, width=55, height=18)
self.chat_area.pack(padx=10, pady=10)
self.chat_area.insert(tk.END, f"【服务端】{SERVER_NAME} 已启动,等待连接...\n")
self.msg_entry = Entry(root, width=45)
self.msg_entry.pack(padx=10, pady=5)
Button(root, text="发送消息", command=self.send_msg).pack(pady=5)
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((IP, PORT))
self.server_socket.listen(5)
self.client_socket = None
self.addr = None
# 等待连接线程
threading.Thread(target=self.listen_conn, daemon=True).start()
def listen_conn(self):
self.client_socket, self.addr = self.server_socket.accept()
self.chat_area.insert(tk.END, f"已连接客户端 {self.addr}\n")
# 专门用来一直接收客户端消息
threading.Thread(target=self.recv_loop, daemon=True).start()
def recv_loop(self):
while True:
try:
data = self.client_socket.recv(1024).decode("utf-8")
if not data:
break
msg = decrypt(data)
# 显示对方发来的消息
self.chat_area.insert(tk.END, f"客户端:{msg}\n")
self.chat_area.see(tk.END)
except:
break
def send_msg(self):
msg = self.msg_entry.get().strip()
if msg and self.client_socket:
en_msg = encrypt(msg)
self.client_socket.send(en_msg.encode("utf-8"))
self.chat_area.insert(tk.END, f"我({SERVER_NAME}):{msg}\n")
self.chat_area.see(tk.END)
self.msg_entry.delete(0, tk.END)
if __name__ == "__main__":
win = tk.Tk()
ServerGUI(win)
win.mainloop()
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, Entry, Button
# ========== 配置信息 ==========
KEY = 123
# 这里填队友电脑的局域网IP
SERVER_IP = "127.0.0.1"
SERVER_PORT = 8888
# 客户端 你的姓名学号
CLIENT_NAME = "张弛"
CLIENT_ID = "20254212"
# =============================
def encrypt(text):
return ''.join([chr(ord(c) ^ KEY) for c in text])
def decrypt(text):
return ''.join([chr(ord(c) ^ KEY) for c in text])
class ClientGUI:
def __init__(self, root):
self.root = root
self.root.title(f"客户端 | {CLIENT_NAME}({CLIENT_ID})")
self.chat_area = scrolledtext.ScrolledText(root, width=55, height=18)
self.chat_area.pack(padx=10, pady=10)
self.chat_area.insert(tk.END, f"【客户端】{CLIENT_NAME} 正在连接服务端...\n")
self.msg_entry = Entry(root, width=45)
self.msg_entry.pack(padx=10, pady=5)
Button(root, text="发送消息", command=self.send_msg).pack(pady=5)
# 连接服务端
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
self.client_socket.connect((SERVER_IP, SERVER_PORT))
self.chat_area.insert(tk.END, "连接服务端成功!\n")
# 开启接收线程
threading.Thread(target=self.recv_loop, daemon=True).start()
except:
self.chat_area.insert(tk.END, "连接失败,请检查IP和端口\n")
def recv_loop(self):
while True:
try:
data = self.client_socket.recv(1024).decode("utf-8")
if not data:
break
msg = decrypt(data)
self.chat_area.insert(tk.END, f"服务端:{msg}\n")
self.chat_area.see(tk.END)
except:
break
def send_msg(self):
msg = self.msg_entry.get().strip()
if msg:
en_msg = encrypt(msg)
self.client_socket.send(en_msg.encode("utf-8"))
self.chat_area.insert(tk.END, f"我({CLIENT_NAME}):{msg}\n")
self.chat_area.see(tk.END)
self.msg_entry.delete(0, tk.END)
if __name__ == "__main__":
win = tk.Tk()
ClientGUI(win)
win.mainloop()
LLM程序优点:
1.开发效率高:无需手动编写,几分钟内即可获得一个完整聊天程序,节省大量时间,操作简单。
2.示图清晰,效果图生成界面清晰,代码结构清晰。
3.服务端客户端变成一体,更加简单。
4.更稳定,没有警告报错情况。
截图:


3. 实验过程中遇到的问题和解决过程
问题1:在连接过程中,始终显示连接不成功。
问题1解决方案:连接同一个热点,关闭防火墙,成功连接
问题2:大模型生成的程序无法有效运行后保留。
问题2解决方案:精进代码,重新让LLM生成,成功输入输出文字和代码。
问题3:在最后上传截图时,由于防火墙全部打开权限太高拒绝了公共网络的访问导致图片一直上传不成功
问题3解决方案:检查网络设置,允许访问
其他(感悟、思考等)
今日主要进行了Socket操作实验,初始阶段在更改IP地址并与同学建立连接时遇到了很多困难。具体问题包括很多,比如IP地址配置错误、防火墙没关闭、服务端与客户端IP不一致等非常之多的困难。经向同学(还有豆包)请教后,这些问题得以有效解决,最终成功运行程序,完成了首个实验。在使用大模型生成程序代码时,程序仅能实现一开始连接,但无法正常发送和接收消息,而且完成程序后秒退。通过优化LLm指令,成功生成了可以收发消息的程序代码,并在调整IP地址后,准确完成了任务。总体而言,本次实验过程虽有很多困难,可以说是三次实验中难度最高的,比前两次难的多,但收获也很多学到了更多知识。
参考资料
《Python程序设计》

浙公网安备 33010602011771号