20242121 实验三《python程序设计》实验报告

课程:《Python程序设计》
班级: 2421
姓名: 陈云龙
学号:20242121
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。

(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
首先,创建服务端:

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} 的链接")


while True:
    data = client_socket.recv(1024)
    if not data:
        break
    print("cyl说:", data.decode('utf-8'))
    response = input("gyz回应:")
    client_socket.send(response.encode('utf-8'))


client_socket.close()
server_socket.close()

然后创建客户端:

import socket


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))


while True:
    message = input("cyl说:")
    client_socket.send(message.encode('utf-8'))
    data = client_socket.recv(1024)
    print("gyz回答:", data.decode('utf-8'))


client_socket.close()

与同学用分别用客户端和服务端进行对话交流

成功实现两台电脑之间的通话
(2)要求包含文件的基本操作,例如打开和读写操作。
在上述代码的基础上,按照老师所给的基础代码,加入文件打开和读写操作
服务端代码

import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os

# 加密密钥,必须是16、24或32字节
key = b'0123456789abcdef0123456789abcdef'  # 替换为实际的密钥

# 初始化向量,必须是16字节
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 和加密数据

# 创建发送端socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_ip = '192.168.150.1'  # 替换为接收端的实际 IP 地址
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

# 加密密钥,必须是16、24或32字节
key = b'0123456789abcdef0123456789abcdef'  # 替换为实际的密钥

# 解密函数
def decrypt_message(encrypted_message):
    iv = encrypted_message[:AES.block_size]  # 提取 IV
    encrypted = encrypted_message[AES.block_size:]  # 提取加密部分
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
    return decrypted

# 创建接收端socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.150.1', 9999)  # 替换为你的实际 IP 地址
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)  # 每次接收 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. 实验过程及结果
    过程如上,结果:成功实现了初步的电脑间通话以及文件加密再解密的过程

  2. 实验过程中遇到的问题和解决过程
    问题1:文件写入了GBK编码的文字
    问题1解决方案:询问豆包,豆包提供了详细的解决方案并提出了代码的改进建议
    问题2:不太会用DES算法加密
    问题2解决方案:听了群里面同学的方法,学习了一点点异或加密
    问题3:如果文本较大无法一次性全部读入输出,后面输出的会覆盖前面的。
    问题3解决方案:可以使用a模式追加。

其他(感悟、思考等)
这个两台电脑通话真的很有意思,让我体会了知识的力量

参考资料
python 对文件进行异或运算:【https://blog.51cto.com/u_16175433/8078029
《从零开始学python》

posted @ 2025-05-07 19:11  cylshushu  阅读(25)  评论(0)    收藏  举报