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

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

课程:《Python程序设计》
班级: 2533
姓名: 胡宸轩
学号: 20253312
实验教师:王志强
实验日期:2026年4月27日
必修/选修: 公选课

1.实验内容

(一)实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(二)实验要求
注意事项:
每人必须做一次客户端和一次服务端,且要和队友(标注学号姓名)互相通信。
要求1:
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求发送方输入内容,加密后并传输;接收方收到密文并解密和显示。要求:发方和收方同时输出明文和明文。
(3)程序代码托管到码云。
(4)添加文件操作,有加分。(可选项)
要求2:使用LLM生成一个带图形界面的程序
(1)分析关键代码的功能和使用方法
(2)分析生成程序的优点
(3)给出运行过程和结果截图
(4)程序代码托管到码云。
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2. 实验过程及结果

要求1:

使用socket库写一个客户端代码,根据我的(20253312)服务端的的端口,设置HOST=192.168.43.12,PORT=3312,并提供给同学
为方便查看,加了一段读取设备名称和输出本设备ip地址的代码
设置连接,用bind绑定IP地址和端口,设置最大连接数量为5
打开日志文件方便后续写入
设置receive部分,接受客户端的内容,输出密文和明文,写入mess_receive.txt文件
设置send部分,发送内容,写入mess_send.txt文件,并输出明文和密文
在两者的部分,只要发送或者接收到exit就断开连接
最后关闭连接和文件
代码:

import socket

HOST = "192.168.43.12"  #20253312胡宸轩<-20253302王紫晗
PORT = 3312

hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
print(hostname, local_ip)

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(5)
print(f"服务器地址:{HOST} 端口:{PORT}")
print("服务器已启动,等待客户端连接------")
conn,addr = s.accept()
print(f"已连接客户端:{addr[0]}  端口:{addr[1]}\n")
mes_receive=open("mess_receive.txt","a+")
mes_send=open("mess_send.txt","a+")
while True:

    #recevie
    data = conn.recv(1024)
    data_decode = data.decode("UTF-8")
    if not data_decode or data_decode == "exit":
        break
    print(f"收到密文: {data}")
    print(f"解密后明文: {data_decode}")
    mes_receive.write(f"密文:{data}\n")
    mes_receive.write(f"明文:{data_decode}\n")

    #send
    message=input("发送内容:")
    if message == "exit":
        break
    conn.send(message.encode("UTF-8"))
    mes_send.write(f"明文:{message}\n")
    mes_send.write(f"密文:{message.encode("UTF-8")}\n")
    print(f"发送明文: {message}")
    print(f"发送密文: {message.encode("UTF-8")}")


print()
print("关闭连接")
mes_receive.close()
mes_send.close()
conn.close()
s.close()

下面是一些示例:
image
这是本次连接中mess_receive.txt中的内容:
image
这是本次连接中mess_send.txt中的内容:
image
连接成功,文件读写成功

再使用socket库写一个客户端代码,根据对方(20253302王紫晗)服务端的的端口,设置HOST=192.168.43.2,PORT=3302
设置连接,打开日志文件方便后续写入
设置send部分,发送内容,写入client_send.txt文件,并输出明文和密文
设置receive部分,接受客户端的内容,输出密文和明文,写入client_receive.txt文件
在两者的部分,只要发送或者接收到exit就断开连接
最后关闭连接和文件
代码:

import socket

HOST = '192.168.43.2' #20253312王紫晗
PORT = 3302

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))
print(f"已连接服务端:{HOST}:{PORT}")
cli_send=open("client_send.txt","a+")
cli_receive=open("client_receive.txt","a+")
while True:

    #send
    message=input("发送内容:")
    s.send(message.encode("UTF-8"))
    if message == 'exit':
        break
    cli_send.write(f"明文:{message}\n")
    cli_send.write(f"密文:{message.encode("UTF-8")}\n")
    print(f"发送明文: {message}")
    print(f"发送密文: {message.encode("UTF-8")}")

    #receive
    data=s.recv(1024).decode("UTF-8")
    if data == 'exit':
        break
    cli_receive.write(data)
    print(f"收到密文: {data}")
    print(f"解密后明文: {data.encode("UTF-8")}")
    cli_receive.write(f"收到密文:{data}\n")
    cli_receive.write(f"收到明文:{data.encode("UTF-8")}\n")

s.close()
cli_receive.close()
cli_send.close()
print()
print("关闭连接")

下面是一些示例:
image
这是本次连接中client_send.txt中的内容:
image
这是本次连接中client_receive.txt中的内容:
image
连接成功,文件读写成功

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

直接将实验要求提供给deepseed,生成两个py文件(生成代码较长,就不放在此处了)
server_gui.py

gitee

client_gui.py

gitee

对于加密和解密的要求,LLM生成的代码引入Crypto库,采用AES加密/解密的方法,这里就不讲述了
(1)分析关键代码的功能和使用方法
AEC加密模块
socket网络通信模块:与上课讲述和自己写的代码用法相同,服务端设置为TCP,bind绑定和listen设置最大连接数,客户端设置TCP,connnect连接

# 服务端监听
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.bind((ip, port))
self.server_socket.listen(5)  # 允许5个连接排队

# 客户端连接
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.client_socket.connect((ip, port))

图形用户界面模块
文件操作模块:使用with的方法打开并读取或者写入文件

# 读取文件
with open(filename, "r", encoding="utf-8") as f:
    content = f.read()

# 保存文件(包含详细格式)
with open(filename, "w", encoding="utf-8") as f:
    f.write("=== 接收信息详情 ===\n")
    f.write(f"时间: {timestamp}\n")
    f.write(f"来自: {client_info}\n")
    f.write(f"\n=== 接收的密文 ===\n{encrypted_data}\n")
    f.write(f"\n=== 解密后的明文 ===\n{decrypted_data}\n")

多线程处理模块
(2)分析生成程序的优点
使用更加高级的加密算法,安全性提高
拥有图形用户界面,使用更加方便,并支持文件预览等功能
拥有多线程设计,可以同时处理多个客户端发送的数据,解决了手写代码不能同时处理输出的问题
支持文本文件直接传输
能够实时显示连接状态和传输速度
拥有错误反馈,更加实用和用户友好
代码可以直接应用于实际,有较高的安全性和实用性(写的代码有点高级)
下面给出一些示例:

服务端示例(拥有接受的密文,解密后的明文,传输详情):

image
image
image

客户端示例(拥有客户端日志,发送的密文,发送的明文,传输详情):

image
image
image
image
运行结果良好,非常贴近实用需求

上述所有文件已经托管到gitee

gitee

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

  • 问题1:同学电脑客户端连接不上我的服务端
  • 问题1解决方法:打开防火墙设置,将python添加到允许通过网络连接中

其他(感悟、思考等)

通过本次实验基本了解了socket的各种用法,能够实用socket写一些小程序使得同学之间可以沟通,非常的实用和有意思。
当然,手写的代码比起实际的需要还有非常大的功能缺失,比如现在只能每个人发一句话,交替的传递信息;不能直接传输文件,只能传输文本;连接不是很稳定,容易断开;一个服务端只能处理一个客户端等。未来还可以向LLM写的代码一样,扩展更多的功能,了解一下Crypto中的各种经典加密算法。

参考资料

posted @ 2026-04-27 22:21  _stream  阅读(5)  评论(0)    收藏  举报