20242321 实验三《Python程序设计》实验报告
20242321 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级:2423
姓名:汤泽鹏
学号:20242321
实验教师:王志强
实验日期:2025年4月16日
必修/选修:公选课
1.实验内容
(1)运用Socket套接字(TCP/UDP)实现服务端和客户端通信
(2)通过文件读写操作传输
(3)对传输内容进行加解密
(4)要求与同学在同一个局域网下进行通信
(5)代码托管到Gitee如下:
SEVER.py · 走于暗巷/pythonhomework - 码云 - 开源中国
CLIENT.py · 走于暗巷/pythonhomework - 码云 - 开源中国
2.实验过程及结果
(1)Socket创建服务端和客户端并实现简单传输:
①导入Socket库并创建套接字(即按照流程分别创建服务端和客户端,但是address暂时保留)
②与搭档连接同一个局域网,在终端中查看ip地址

③将服务端一方的ip及端口号填入address
④服务端先运行,客户端再运行
代码如下:
服务端:
# 作者:20242321汤泽鹏
# 地点:电科院
# 时间:4 a.m
# 代理地址:Los Angels
import socket
sever_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.43.134', 9999)
sever_socket.bind(address)
print("开始监听")
sever_socket.listen(5)
client_socket, client_address = sever_socket.accept()
print('我们收到了来自{}的连接'.format(client_address))
while True:
data = client_socket.recv(1024)
if not data:
break
print('用户说了{}'.format(data.decode("utf-8")))
client_socket.send(input('客户端回应:').encode("utf-8"))
client_socket.close()
客户端:
# 作者:20242321汤泽鹏
# 地点:电科院
# 时间:4 a.m
# 代理地址:Los Angels
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 9999))
while True:
client_socket.send(input('客户端说:').encode("utf-8"))
data = client_socket.recv(1024)
print('服务端说:', data.decode("utf-8"))
client_socket.close()
实验结果如下:


(2)Socket实现文件加解密传输
①加密方式简述:
我选择的是cryptography库里的fernet加密算法,这是一种简单但是安全的对称加密算法,只需要传输密文和密钥就可以调用函数库里的方法来加解密
如服务端接收到了一个密钥key,调用方法cipher=Fernet(key),然后再调用方法dec_data=cipher.decrypt(enc_data),即可完成解密,加密同理
②具体实现方法:
在简单通信方式的基础上,创建一个存储密钥的文件(如secret.key),密钥可以直接用大模型生成(如:mL_eh1p7-Iw6Yp7aW3qG0BHBuai-ArYylzpxV8ZIGMU=),创建一个存储密文的文件(如source_file.txt)。
服务端启动,等待连接,客户端连接,将明文写入文件,调用函数加密后传输,服务端接收密文和密钥解密即可。注意读文件时为'rb',写文件时为'wb'。
③代码如下:
服务端:
# 作者:20242321汤泽鹏
# 地点:电科院
# 时间:4 a.m
# 代理地址:Los Angels
from cryptography.fernet import Fernet
import socket
with open("secret.key", "rb") as key_file:
key = key_file.read()
cipher = Fernet(key)
def start_sever():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('192.168.43.134', 8080))
server_socket.listen(5)
print("服务器已启动,等待连接...")
while True:
client_socket,client_address = server_socket.accept()
print("收到来自{client_address}的连接".format(client_address=client_address))
encrypted_data = client_socket.recv(1024)
decrypted_data = cipher.decrypt(encrypted_data)
with open("received_file.txt","wb") as receive_file:
receive_file.write(decrypted_data)
print("文件接收并解密完成")
print(f"客户端说:{decrypted_data.decode("UTF-8")}")
client_socket.close()
start_sever()
客户端:
# 作者:20242321汤泽鹏
# 地点:电科院
# 时间:4 a.m
# 代理地址:Los Angels
from cryptography.fernet import Fernet
import socket
with open('secret.key', 'rb') as key_file:
key = key_file.read()
cipher = Fernet(key)
def send_file(client_filename):
with open(client_filename, 'rb') as file:
original_file = file.read()
encrypted_data = cipher.encrypt(original_file)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.43.59', 8080))
client_socket.send(encrypted_data)
print("文件已加密发送")
client_socket.close()
while True:
client_input = input("是否要发送文件Y/n:")
if client_input in ('Y', 'y'):
client_filename = input("请输入要发送的文件名")
send_file(client_filename)
elif client_input in ('N', 'n'):
print('''结束文件传输。
感谢使用。''')
break
else:
print("输入无效,请输入Y/n")
实验结果如下:
我作为客户端时:


我作为服务端时:


3.实验过程中遇到的问题和解决过程
-
问题1:不知道python中怎么进行文件操作
-
问题1解决过程:上CSDN查了一下Python超详细基础文件操作(详解版)_python操作文件-CSDN博客,稍微总结一下这个实验中我用到的文件操作吧:
①读入文件:with open(file_path, 'r') as file:
# 执行文件操作,例如读取文件内容
②读取内容:key = key_file.read( )
-
问题2:我和搭档通信时,当我作为服务端时address没问题,但是当我作为用户端的时候address却要改成搭档的ip了,我原本以为局域网是我的终端开的,不论是服务端还是客户端都要填我的ip
-
问题2解决过程:我先向deepseek询问了错误原因得到了更改的方法,然后又上CSDN上查了python使用socket在同一局域网下不同电脑传输数据(tcp)_tcp sockets局域网-CSDN博客,简单来说就是address就是服务端的ip,如果不是局域网通信,则直接填'localhost'就可以了。
4.其他(感悟、思考等)
-
有点有意思是我向deepseek问了一个问题,我在看它的参考文章时发现,它居然学习了几天前我们公选课中另一位同学的实验报告,这个更新速度太赞了。

-
刚开始搭档的代码一直报错,显示没安装'cryptography'模块,研究了挺久,不仅换了解释器,还重新配了环境,结果运行代码时都不行。最后发现,每次执行的代码都不是当前代码,而是之前一个有错的代码。。。但是最后连上并通信时也是挺激动的。


浙公网安备 33010602011771号