课程:《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:网络连接问题
    解决方案:
    (1)确保接收端代码已启动,并显示“开始监听...”的消息。
    (2)检查发送端和接收端的 IP 地址与端口号是否一致。
    2:AES 密钥长度错误
    解决方案:
    (1)修改密钥定义,确保其长度符合要求
    其他(感悟、思考等)
    感悟:
    在课堂上学习了 Socket 编程的基本原理(如 TCP/IP 协议、客户端-服务端模型等),但真正动手实现时才发现理论和实践之间存在差距。
    思考:
    网络编程需要将多个知识点结合起来,例如 IP 地址、端口号。
    参考资料
    《Python从入门到实践》
    学习通《socket编程技术.doc》