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

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

课程:《Python程序设计》

班级: 2542

姓名: 黄婉婷

学号:20254226

实验教师:王志强

实验日期:2025年4月28日

必修/选修: 专选课

1.实验内容

注意事项: 每人必须做一次客户端和一次服务端,且要和队友(标注学号姓名)互相通信。

要求1:

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

(2)要求发送方输入内容,并传输;接收方收到信息并显示。

要求2:使用LLM生成一个带图形界面的程序

(1)分析关键代码的功能和使用方法

(2)分析生成程序的优点

(3)给出运行过程和结果截图

注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等

工具编程实现。

2. 实验过程及结果

要求1

(1)制造一个通信端口

• 连接同一个热点

image

• 点开控制面板>网络和Internet>网络连接>WiFi(即刚刚连接的热点)

• 或者使用快捷键Win+R

image

• 点击属性>IPv4

image

• 勾选使用下面的IP地址使用下面的DNS服务地址

• 填写IP地址,后面两位改成学号

22

(2)创造服务端,并进行通讯

• 20254226黄婉婷192.168.1.26(服务端)与20254212张弛(客户端)进行通讯

• 代码如下:

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

# 文件名: SockeServer
# 描  述:
# 作  者: 20254226黄婉婷
# 日  期: 2026/4/27
#  Have you ever seen Los Angeles at 4 a.m?
import socket #pip install socket
#创建TCP Socket对象(我买了一台手机)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#我去办了张电话卡
HOST = "192.168.1.26" #"localhost"
PORT = 4444

server.bind((HOST, PORT))#我把电话卡插到手机上
server.listen(1)
print("服务端已经启动,等待客户端连接......")

conn, addr = server.accept()
print(f"已连接客户端:{addr}")

while True:
    #接收消息
    data = conn.recv(1024).decode("utf-8")
    if not data or data == "exit":
        print("聊天结束")
        break
    print(f"客户端:{data}")

    send_msg = input("我:")
    conn.send(send_msg.encode("utf-8"))
    if send_msg == "exit":
        break

conn.close()
server.close()

• 通讯过程

c246f015a33df02537557a2014493c68

(3)创造客户端,并进行通讯

• 代码如下:

# 文件名: SocketClent
# 描  述:
# 作  者: 20254226黄婉婷
# 日  期: 2026/4/27
#  Have you ever seen Los Angeles at 4 a.m?
import socket

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

#学号:20254226
HOST = "192.168.1.4"
PORT = 4444

client.connect((HOST, PORT))
print("已连接服务端!输入exit退出聊天!")
while True:
    #发送数据
    send_msg = input("我:")
    client.send(send_msg.encode("utf-8"))
    if send_msg == "exit":
        break
    #接收数据
    data = client.recv(1024).decode("utf-8")
    if not data or data == "exit":
        print("聊天结束")
        break
    print(f"\n服务端:{data}")

client.close()

• 通讯过程

d32a43262478273bdf0031b28bcb77ad

要求2:使用LLM生成一个带图形界面的程序

分析关键代码的功能和使用方法

(1)创造服务端,并进行通讯

  • 20254226黄婉婷192.168.1.26(服务端)与20254204刘俐(客户端)进行通讯

  • 代码如下

import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, Entry, Button

# ========== 在这里改自己和队友信息 ==========
KEY = 123
IP = '192.168.1.26'
PORT = 8888

# 服务端 姓名学号
SERVER_NAME = "黄婉婷"
SERVER_ID = "20254226"
# ==========================================

# 简单加解密
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()

通讯过程

972ec355c4ee5291067d797e882b5c1d

(2)创造客户端,并进行通讯

  • 20254226黄婉婷192.168.1.04(客户端)与20254204刘俐(服务端)进行通讯

  • 代码如下

import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, Entry, Button

# ========== 配置信息 ==========
KEY = 123
# 这里填队友电脑的局域网IP
SERVER_IP = "192.168.1.04"
SERVER_PORT = 8888

# 客户端 你的姓名学号
CLIENT_NAME = "黄婉婷"
CLIENT_ID = "20254226"
# =============================

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()
  • 通讯过程
    4849a9bd63aa689a40b627d15237c9d6

分析生成程序的优点

优点 缺点
生成程序 ① 图文结合,更让人有代入感; ② 界面显示名字和学号。 必须点发送消息才可发送,在界面上直接打字接受不到消息

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

问题1:对方的防火墙强,一直连不上去。

问题1解决方案:排除其他因素,将防火墙关闭,就可以进行连接。

问题2:更改地址时将别的地址用作IPv4

问题2解决方案:上网搜索地址表示法。

问题三:LLM生成的程序只能单向沟通。

问题3解决方案:重新生成一个可以双向通行的代码。

问题四:做完实验后电脑卡顿。

问题4解决方案:将地址改成自动形式,并把防火墙打开。

其他(感悟、思考等)

通过这次实验,我学会了如何制造通信端口,更改IPv4,并创建服务端和客服端,和对方进行通信,这十分有趣!在LLM生成程序时,我不断进行优化,从单向通信到双向通信再到学号的显示,提出自己的需求,完善该程序。在与同学相互合作中,有些电脑防火墙强,有些同学学号特殊等等,不同的情况和困难浮现,我们却没有放弃,一起互帮互助,上网搜寻,询问老师、智能体,终于一起解决了问题!

参考资料

《Python程序设计》

posted @ 2026-05-11 12:53  20254226黄婉婷  阅读(13)  评论(0)    收藏  举报