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:文件写入了GBK编码的文字
问题1解决方案:询问豆包,豆包提供了详细的解决方案并提出了代码的改进建议
问题2:不太会用DES算法加密
问题2解决方案:听了群里面同学的方法,学习了一点点异或加密
问题3:如果文本较大无法一次性全部读入输出,后面输出的会覆盖前面的。
问题3解决方案:可以使用a模式追加。
其他(感悟、思考等)
这个两台电脑通话真的很有意思,让我体会了知识的力量
参考资料
python 对文件进行异或运算:【https://blog.51cto.com/u_16175433/8078029
《从零开始学python》