20242319 实验三《Python程序设计》实验报告
20242319 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级:2423
姓名:万翔宇
学号:20242319
实验教师:王志强
实验日期:2025年4月16日
必修/选修:公选课
一.实验内容
- 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
具体要求:
1.创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
2.要求包含文件的基本操作,例如打开和读写操作。
3.要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
4.程序代码托管到码云。
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
二. 实验过程及结果
加密过程使用异或运算加密
(一)服务端
-
服务端先绑定IP和端口,然后等待客户端发送信息
-
接收到客户端的信息后,使用KEY解密密文并写入server.txt文本文件中
-
向客户端答复“发送成功!”
服务端代码:
import socket
IP = '172.16.208.5'
PORT = 2025
KEY = b'123456'
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((IP,PORT))
server_socket.listen(5)
print("服务端",IP,"开始监听....")
while True:
client_socket, client_address = server_socket.accept()
print(f"我们收到来自{client_address}的连接")
try:
data = client_socket.recv(1024)
with open('server.txt','wb') as f:
f.write(bytes([b ^ KEY[i % len(KEY)] for i, b in enumerate(data)]))
with open('server.txt','r') as f:
content = f.read()
print("接收内容:",content)
response = "发送成功!"
client_socket.send(response.encode('utf-8'))
finally:
client_socket.close()
print("客户端已断开连接")
(二)客户端
-
使用KEY对client.txt文本文件中的明文进行异或加密,并将密文发送给服务端
-
当接收到服务端发送的“发送成功!”的信息时,表明密文成功发送
客户端代码:
import socket
IP = '172.16.208.5'
PORT = 2025
KEY = b'123456'
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((IP,PORT))
with open('client.txt','rb') as f:
message = f.read()
client_socket.send(bytes([b ^ KEY[i % len(KEY)] for i, b in enumerate(message)]))
response = client_socket.recv(1024)
print(response.decode('utf-8'))
client_socket.close()
(三)运行结果
- 启动服务端

- 在client.txt中输入要发送的明文

- 客户端成功发送信息

- 服务端成功接收信息


(四)程序代码托管到码云
三. 实验过程中遇到的问题和解决过程
-
问题1:在客户端对明文进行异或运算加密时,程序报错,显示无法进行加密
-
问题1解决方案:进行异或加密的对象是字节,在读取文件内容时不能用单纯'r',需使用'rb'读取二进制内容;在服务端读写的时候也同样需要注意使用'rb'和'wb'
-
问题2:设置的KEY无法加解密文本内容
-
问题2解决方案:KEY也需要使用字节格式对内容加解密,在KEY中加上b'...'即可
其他(感悟、思考等)
我明白了网络通信不再是虚无缥缈的概念,但无论如何,python太强大了!
Practice makes perfect!!!
