课程:《Python程序设计》
班级: 2421
姓名: 郭禹震
学号:20242104
实验教师:王志强
实验日期: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》