20253117 实验三《Python程序设计》实验报告

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

课程名称 《Python程序设计》 班级 2531
姓名 李世航 学号 20253117
实验教师 王志强 实验日期 2026年4月27日
课程类型 公选课

✨ 一、实验内容

  • 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。每人必须做一次客户端和一次服务端,且要和队友(标注学号姓名)互相通信。

  • 要求1:

    (1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
    (2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出密文和明文。
    (3)程序代码托管到码云。
    (4)添加文件操作,有加分。(可选项)
    
  • 要求2:使用LLM生成一个带图形界面的程序

    (1)分析关键代码的功能和使用方法
    (2)分析生成程序的优点
    (3)给出运行过程和结果截图
    (4)程序代码托管到码云。
    

🔍 二、实验过程及结果

📋 2.1 实验准备

我的队友是20253202吴江浩

📈 2.2 实验步骤

  1. 步骤1: 我首先跟着老师编写了初步的代码,并实现了自己扮演客户端和服务端的通信
import socket
# 创建TCP   socket(买手机)
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#办电话卡
HOST = "0.0.0.0"
PORT = 1245

server_socket.bind((HOST, PORT))#电话卡插手机
server_socket.listen(1)
print("服务端已启动,等待连接……")

conn, addr = server_socket.accept()

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

#接收消息
data = conn.recv(1024).decode("utf-8")
print(f"收到客户端消息: {data}")

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

conn.close()
server_socket.close()
import socket

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

HOST = "127.0.0.1"
PORT = 1245

client.connect((HOST, PORT))
print("已连接到服务端")

# 发送消息
send_msg = input("我:")
client.send(send_msg.encode("utf-8"))

# 接收消息
data = client.recv(1024).decode("utf-8")
print(f"服务端: {data}")

client.close()

屏幕截图 2026-04-27 195630

  1. 步骤2: 之后,我升级了代码,实现循环和加密功能
import socket

# 加密函数
def encrypt(text, key=3):
    result = ""
    for char in text:
        result += chr(ord(char) + key)
    return result

# 解密函数
def decrypt(text, key=3):
    result = ""
    for char in text:
        result += chr(ord(char) - key)
    return result

# 创建TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

HOST = "192.168.43.17" 
PORT = 2225

server_socket.bind((HOST, PORT))
server_socket.listen(1)
print("服务端已启动,等待连接……")

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

# 打开文件记录聊天
file = open("chat_log.txt", "a", encoding="utf-8")

while True:
    # 接收密文
    cipher = conn.recv(1024).decode("utf-8")
    if not data:
        break
    
    # 解密
    plain = decrypt(cipher)
    
    print("\n【收到】")
    print("密文:", cipher)
    print("明文:", plain)
    
    # 写入文件
    file.write(f"客户端密文:{cipher},明文:{plain}\n")
    file.flush()

    if plain == "exit":
        break

    # 发送消息
    send_plain = input("\n我:")
    send_cipher = encrypt(send_plain)
    
    # 输出明文 + 密文
    print("\n【发送】")
    print("明文:", send_plain)
    print("密文:", send_cipher)
    
    # 发送密文
    conn.send(send_cipher.encode("utf-8"))
    
    # 写入文件
    file.write(f"服务端明文:{send_plain},密文:{send_cipher}\n")
    file.flush()

    if send_plain == "exit":
        break

file.close()
conn.close()
server_socket.close()
import socket

# 加密
def encrypt(text, key=3):
    result = ""
    for char in text:
        result += chr(ord(char) + key)
    return result

# 解密
def decrypt(text, key=3):
    result = ""
    for char in text:
        result += chr(ord(char) - key)
    return result

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

HOST = "192.168.43.17"
PORT = 2225

client.connect((HOST, PORT))
print("已连接到服务端")

# 打开文件记录聊天
file = open("client_log.txt", "a", encoding="utf-8")

while True:
    # 发送
    send_plain = input("\n我:")
    send_cipher = encrypt(send_plain)
    
    print("\n【发送】")
    print("明文:", send_plain)
    print("密文:", send_cipher)
    
    client.send(send_cipher.encode("utf-8"))
    
    # 写入文件
    file.write(f"客户端明文:{send_plain},密文:{send_cipher}\n")
    file.flush()
    
    if send_plain == "exit":
        break

    # 接收
    cipher = client.recv(1024).decode("utf-8")
    plain = decrypt(cipher)
    
    print("\n【收到】")
    print("密文:", cipher)
    print("明文:", plain)
    
    # 写入文件
    file.write(f"服务端密文:{cipher},明文:{plain}\n")
    file.flush()

    if plain == "exit":
        break

file.close()
client.close()
  1. 步骤3: 下面,是我和队友互相通信
    4.1 我首先配置了我手机热点的IP地址为198.168.43.17
    屏幕截图 2026-05-02 102813
    4.2 之后,我和队友链接后进行通信
    image
    image
    这是文件操作

image

  1. 步骤4:使用LLM生成一个带图形界面的程序
    (1)首先让AI给出代码
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, END

def encrypt(text, key=3):
    result = ""
    for char in text:
        result += chr(ord(char) + key)
    return result

def decrypt(text, key=3):
    result = ""
    for char in text:
        result += chr(ord(char) - key)
    return result

class ServerGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("加密聊天 - 服务端")
        self.root.geometry("550x500")

        self.chat_area = scrolledtext.ScrolledText(root, width=65, height=18)
        self.chat_area.pack(pady=10)
        self.chat_area.insert(END, "【系统】服务端已启动,等待客户端连接...\n")

        self.msg_entry = tk.Entry(root, width=50)
        self.msg_entry.pack(pady=5)

        self.send_btn = tk.Button(root, text="发送消息", command=self.send_msg)
        self.send_btn.pack(pady=5)

        self.conn = None
        threading.Thread(target=self.start_server, daemon=True).start()

    def start_server(self):
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        HOST = "192.168.43.17"
        PORT = 2225
        server_socket.bind((HOST, PORT))
        server_socket.listen(1)
        self.conn, addr = server_socket.accept()
        self.chat_area.insert(END, f"【系统】已连接客户端:{addr}\n")

        while True:
            try:
                cipher = self.conn.recv(1024).decode("utf-8")
                if not cipher:
                    break
                plain = decrypt(cipher)
                self.chat_area.insert(END, f"\n【客户端】明文:{plain}\n【密文】{cipher}\n")
                self.chat_area.see(END)
                if plain == "exit":
                    break
            except:
                break

    def send_msg(self):
        msg = self.msg_entry.get().strip()
        if not msg or not self.conn:
            return
        cipher = encrypt(msg)
        self.chat_area.insert(END, f"\n【我】明文:{msg}\n【密文】{cipher}\n")
        self.conn.send(cipher.encode("utf-8"))
        self.chat_area.see(END)
        self.msg_entry.delete(0, END)
        if msg == "exit":
            self.conn.close()

if __name__ == "__main__":
    root = tk.Tk()
    ServerGUI(root)
    root.mainloop()
import socket
import threading
import tkinter as tk
from tkinter import scrolledtext, END

def encrypt(text, key=3):
    result = ""
    for char in text:
        result += chr(ord(char) + key)
    return result

def decrypt(text, key=3):
    result = ""
    for char in text:
        result += chr(ord(char) - key)
    return result

class ClientGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("加密聊天 - 客户端")
        self.root.geometry("550x500")

        self.chat_area = scrolledtext.ScrolledText(root, width=65, height=18)
        self.chat_area.pack(pady=10)
        self.chat_area.insert(END, "【系统】正在连接服务端...\n")

        self.msg_entry = tk.Entry(root, width=50)
        self.msg_entry.pack(pady=5)

        self.send_btn = tk.Button(root, text="发送消息", command=self.send_msg)
        self.send_btn.pack(pady=5)

        self.client = None
        threading.Thread(target=self.connect_server, daemon=True).start()

    def connect_server(self):
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        HOST = "192.168.43.17"
        PORT = 2225
        try:
            self.client.connect((HOST, PORT))
            self.chat_area.insert(END, "【系统】已成功连接服务端!\n")
        except:
            self.chat_area.insert(END, "【系统】连接失败!\n")
            return

        while True:
            try:
                cipher = self.client.recv(1024).decode("utf-8")
                if not cipher:
                    break
                plain = decrypt(cipher)
                self.chat_area.insert(END, f"\n【服务端】明文:{plain}\n【密文】{cipher}\n")
                self.chat_area.see(END)
                if plain == "exit":
                    break
            except:
                break

    def send_msg(self):
        msg = self.msg_entry.get().strip()
        if not msg or not self.client:
            return
        cipher = encrypt(msg)
        self.chat_area.insert(END, f"\n【我】明文:{msg}\n【密文】{cipher}\n")
        self.client.send(cipher.encode("utf-8"))
        self.chat_area.see(END)
        self.msg_entry.delete(0, END)
        if msg == "exit":
            self.client.close()

if __name__ == "__main__":
    root = tk.Tk()
    ClientGUI(root)
    root.mainloop()

(2)运行AI的代码
image
image
(3)生成程序的优点

  1. ** 带图形界面(GUI),操作简单直观 **
    不用敲命令行,点开就能用,输入文字点发送即可,任何人都能快速上手。
  2. ** 自动加密传输,聊天内容更安全 **
    采用字符偏移加密算法,网络上传输的是密文,不会直接暴露真实聊天内容。
  3. ** 明文、密文同时显示 **
    发送和接收时,界面会同时展示原始明文和加密后的密文,方便观察加密效果。
  4. ** TCP 可靠传输,消息不丢失 **
    基于 TCP 协议建立连接,传输稳定,适合局域网内一对一聊天。

⚠️ 三、实验过程中遇到的问题和解决过程

  • ❌ 问题1:服务端和客户端老是链接不上
    ✅ 解决方案:多次尝试,发现是IP不符、端口不对、WiFi连的不是同一个等等问题
  • ❌ 问题2:有的时候莫名报错
    ✅ 解决方案:,询问AI后,发现是一些东西没有安装,打开CMD,输入“pip install ”,安装对应模块

💡 四、其他(感悟、思考等)

本次《Python 程序设计》加密聊天系统实验,不仅是一次技术实操的锻炼,更是一场思维与能力的双重提升,让我对 Python 编程、网络通信以及问题解决有了更为深刻的认知与体会。
实验之初,我从最基础的 Socket 套接字编程入手,编写简单的客户端与服务端代码,实现了最基本的双向通信。看似简单的代码,却藏着诸多细节 ——IP 地址的配置、端口的选择、编码格式的统一,哪怕一个微小的失误,都可能导致 “ConnectionRefusedError” 这样的连接失败问题。

📖 五、参考资料

📖 六、Gitee托管

本次实验代码已托管至Gitee
image
image

仓库链接:git -home

文件链接:服务端.py
文件链接:客户端.py
文件链接:AI服务端.py
文件链接:AI客户端.py

posted @ 2026-05-02 12:49  李世航  阅读(11)  评论(0)    收藏  举报