课程:《Python程序设计》
班级: 2421
姓名: 郭禹震
学号:20242104
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
(一)实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(二)实验过程及结果
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
过程代码呈现、结果如下:
(1)环境准备
pip install pycryptodome
(2)创建服务端和客户端,实现通信
服务端代码
服务端运行结果
客户端代码
客户端运行结果
(3)发送文件并接受
发送端代码
import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os
key = b'0123456789abcdef0123456789abcdef' # 替换为实际的密钥
iv = os.urandom(16)
def encrypt_message(message):
cipher = AES.new(key, AES.MODE_CBC, iv)
encrypted = cipher.encrypt(pad(message, AES.block_size))
return iv + encrypted # 返回 IV 和加密数据
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_ip = '192.168.150.1'
server_port = 9999
client_socket.connect((server_ip, server_port))
file_name = "example.txt"
with open(file_name, "rb") as file:
content = file.read()
print(f"正在加密文件 {file_name}...")
encrypted_content = encrypt_message(content)
print("正在发送加密文件...")
client_socket.sendall(encrypted_content)
print(f"文件 {file_name} 已成功加密并发送")
client_socket.close()
发送端运行结果
接收端代码
import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
key = b'0123456789abcdef0123456789abcdef'
def decrypt_message(encrypted_message):
iv = encrypted_message[:AES.block_size]
encrypted = encrypted_message[AES.block_size:]
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
return decrypted
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.150.1', 9999)
server_socket.bind(address)
server_socket.listen(5)
print("开始监听....", address)
client_socket, client_address = server_socket.accept()
print(f"已收到来自 {client_address} 的连接")
print("正在接收加密文件...")
received_data = b""
while True:
chunk = client_socket.recv(4096)
if not chunk:
break
received_data += chunk
print("文件已成功接收,正在解密...")
decrypted_content = decrypt_message(received_data)
output_file = "decrypted_file.txt"
with open(output_file, "wb") as file:
file.write(decrypted_content)
print(f"文件已成功解密并保存为 {output_file}")
client_socket.close()
server_socket.close()
接收端运行结果
- 实验过程中遇到的问题和解决过程
1:网络连接问题
解决方案:
(1)确保接收端代码已启动,并显示“开始监听...”的消息。
(2)检查发送端和接收端的 IP 地址与端口号是否一致。
2:AES 密钥长度错误
解决方案:
(1)修改密钥定义,确保其长度符合要求
其他(感悟、思考等)
感悟:
在课堂上学习了 Socket 编程的基本原理(如 TCP/IP 协议、客户端-服务端模型等),但真正动手实现时才发现理论和实践之间存在差距。
思考:
网络编程需要将多个知识点结合起来,例如 IP 地址、端口号。
参考资料
《Python从入门到实践》
学习通《socket编程技术.doc》