20242129《Python程序设计》实验三报告
20242129 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2421
姓名: 史若晨
学号:20242129
实验教师:王志强
实验日期:2025年4月16日
必修/选修:公选课
1. 实验内容
- 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信
2. 实验要求
- 创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序
- 要求包含文件的基本操作,例如打开和读写操作
- 要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中
- 程序代码托管到码云
3. 实验过程及结果
1. 实验代码
客户端
#通过Socket套接字进行通信
import socket
#新建客户端socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接
client_socket.connect(('192.168.43.54', 8080))
#发送数据
while True:
client_socket.send(input("客户端说:").encode())
data = client_socket.recv(1024)
print("服务端回答:{}".format(data.decode('utf-8')))
client_socket.close()
#通过socket和aes加密传输加密文件
import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
# 加密密钥,必须是16、24或32字节
key = b'2cbed40efc5cd05b5eddd706d0e1265f'
# 初始化向量,必须是16字节
iv = bytes.fromhex('2cbed40efc5cd05b5eddd706d0e1265f')
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)
client_socket.connect(('192.168.43.54', 8080))
# 固定文件路径
file_path = r'D:\code\python\file.txt'
try:
# 读取文件内容
with open(file_path, '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("文件未找到,请检查路径。")
except Exception as e:
print(f"发生错误: {e}")
finally:
client_socket.close()
服务端
#通过Socket套接字进行通信
import socket
#新建服务端socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.43.34', 8080)
#绑定
server_socket.bind(address)
#监听
server_socket.listen(5)
print("开始监听....",address)
#accept
client_socket, client_address = server_socket.accept()
print("我们收到{}的连接".format(address))
while True:
data = client_socket.recv(1024)
if not data:
break
print("客户端说:{}".format(data.decode('utf-8')))
client_socket.send(input("服务器回应:").encode())
#关闭
client_socket.close()
#收到加密文件读取并解密文件
import socket
import os
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
# 加密密钥,必须是16、24或32字节
key = b'2cbed40efc5cd05b5eddd706d0e1265f'
# 初始化向量,必须是16字节
iv = bytes.fromhex('2cbed40efc5cd05b5eddd706d0e1265f')
def decrypt_message(encrypted_message):
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(encrypted_message), AES.block_size)
return decrypted.decode('utf-8')
# 创建服务端 Socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.43.34', 8080)
server_socket.bind(address)
server_socket.listen(5)
print("服务端开始监听....", address)
# 接收客户端连接
client_socket, client_address = server_socket.accept()
print("收到来自 {} 的连接".format(client_address))
try:
# 接收加密数据
encrypted_data = client_socket.recv(4096)
if encrypted_data:
# 解密数据
decrypted_data = decrypt_message(encrypted_data[16:]) # 跳过前16字节的IV
print("解密后的文件内容: {}".format(decrypted_data))
else:
print("未收到数据。")
except Exception as e:
print(f"发生错误: {e}")
finally:
client_socket.close()
server_socket.close()
2. 实验结果





3. 代码托管到码云

4. 实验过程中遇到的问题和解决过程
- 问题1:监听的ip错误
- 问题1解决方案:终端管理员输入ipconfig查看
- 问题2:客户端报错iv不是十六字节
- 问题2解决方案:将十六进制字符串转换为二进制数据
其他(感悟、思考等)
两端的key和iv必须相同才可正确运行,不可都使用随机密钥,这样key对不上

浙公网安备 33010602011771号