学号20242313 2024 - 2025 《Python 程序设计》实验 3 报告

学号20242313 2024 - 2025 《Python 程序设计》实验 3 报告

课程:《Python 程序设计》
班级: 2423
姓名: 曾海鹏
学号:20242313
实验教师:王志强
实验日期:2025 年 4 月 16 日
必修 / 选修: 公选课

1. 实验内容

(1)创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过 Socket 套接字(TCP/UDP)进行通信。
(2)要求包含文件的基本操作,例如打开和读写操作。发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(3)最后将程序代码托管到码云。

2. 实验过程及结果

(1)根据老师课程教学代码,选择 Pycharm 作为编程工具,编写服务端和客户端代码。服务端代码监听特定端口,接收客户端发送的加密数据,解密后保存到文件中;客户端代码从文件读取内容,加密后发送给服务端。
(2)测试代码,先启动服务端,再启动客户端,确保test.txt文件存在于客户端代码所在的目录下。测试成功后,服务端所在目录下生成了received_file.txt文件,并且文件内容与test.txt一致。

源代码如下:

# -*- coding: utf-8 -*-  
  
import socket  
from Crypto.Cipher import AES  
from Crypto.Util.Padding import pad, unpad  
import os  
 
key = os.urandom(16)   
iv = os.urandom(16)  
  
def encrypt_message(message):  
    cipher = AES.new(key, AES.MODE_CBC, iv)  
    encrypted = cipher.encrypt(pad(message.encode('utf-8'), AES.block_size))  
    return iv + encrypted  
  
# 创建 socket 对象  
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  
# 连接到服务器  
server_address = ('localhost', 8888)  
client_socket.connect(server_address)  
  
# 发送加密密钥和初始化向量  
client_socket.send(key)  
client_socket.send(iv)  
  
# 读取 test.txt 文件内容  
try:  
    with open('test.txt', 'r', encoding='utf-8') as file:  
        file_content = file.read()  
    # 加密文件内容  
    encrypted_content = encrypt_message(file_content)  
    # 发送加密后的文件内容  
    client_socket.send(encrypted_content)  
    print('文件内容已发送')  
except FileNotFoundError:  
    print('test.txt 文件未找到')  
  
# 关闭连接  
client_socket.close()  
# -*- coding: utf-8 -*-  
  
import socket  
from Crypto.Cipher import AES  
from Crypto.Util.Padding import pad, unpad  
import os  
  
def decrypt_message(encrypted_message, key, iv):  
    cipher = AES.new(key, AES.MODE_CBC, iv)  
    decrypted = unpad(cipher.decrypt(encrypted_message[AES.block_size:]), AES.block_size)  
    return decrypted.decode('utf-8')  
  
# 创建 socket 对象  
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  
# 绑定地址和端口  
server_address = ('localhost', 8888)  
server_socket.bind(server_address)  
  
# 监听连接  
server_socket.listen(1)  
print('服务器正在监听 {}:{}'.format(*server_address))  
  
# 接受客户端连接  
client_socket, client_address = server_socket.accept()  
print('接受来自 {} 的连接'.format(client_address))  
  
# 接收加密密钥和初始化向量  
key = client_socket.recv(16)  
iv = client_socket.recv(16)  
  
# 接收加密后的文件内容  
encrypted_content = client_socket.recv(4096)  
  
# 解密文件内容  
decrypted_content = decrypt_message(encrypted_content, key, iv)  
  
# 将解密后的内容写入 received_file.txt 文件  
with open('received_file.txt', 'w', encoding='utf-8') as file:  
    file.write(decrypted_content)  
print('文件已接收并保存为 received_file.txt')  
  
# 关闭连接  
client_socket.close()  
server_socket.close()

测试结果如下图所示:


(3)将代码推送到码云仓库。
https://gitee.com/jame-zhp_0/pythonhomework/commit/ba8a03d2197090f449fb633b3a9776fd251a4372

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

  • 问题 1:在运行代码时,出现FileNotFoundError错误。
  • 问题 1 解决方案:检查文件路径,确保test.txt文件存在于客户端代码所在的目录下。
  • 问题 2:在将代码推送到码云时,出现权限问题。
  • 问题 2 解决方案:检查码云仓库地址是否正确,以及是否有足够的权限进行推送。

其他(感悟、思考等)

通过本次实验,我对 Python 的 Socket 编程有了更深入的理解,学会了如何使用 Socket 进行网络通信,以及如何进行文件的读写和加密操作。同时,也掌握了如何将代码托管到码云,方便代码的管理和分享。在实验过程中,遇到问题并解决问题的过程让我收获颇丰,提高了自己的编程能力和解决问题的能力。

参考资料

  • Python 零基础
  • 《王志强带我学python》
  • 《Python 网络编程》相关书籍和教程
posted @ 2025-04-27 21:59  20242313曾海鹏  阅读(51)  评论(0)    收藏  举报