20222217 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2222
姓名: 黄子宽
学号:20222217
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
2. 实验过程及结果
1.(1)创建服务端和客户端,选择一个通信端口。代码如下:
服务端1
import socket
s_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.0.104', 8080)
s_socket.bind(address)
s_socket.listen(5)
print("我们正在listening....",address)
c_socket, c_address = s_socket.accept()
print("we ve received{}connection".format(address))
while True:
data = c_socket.recv(1024)
if not data:
break
print("client say:{}".format(data.decode('utf-8')))
c_socket.send(input("server reply:").encode())
c_socket.close()
客户端1
import socket
c_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c_socket.connect(('192.168.0.104', 8080))
while True:
c_socket.send(input("client say:").encode())
d = c_socket.recv(1024)
print("server reply:{}".format(d.decode('utf-8')))
c_socket.close()
运行代码结果如下
、
2.创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序并使用包含文件的基本操作,例如打开和读写操作。代码如下:
(1).服务器设计思路
a. 核心功能:监听客户端连接(bind() + listen()),接收加密数据(recv(4097))
AES-256-CBC 解密(跳过前16字节IV,解密剩余数据),输出解密后的明文
关闭连接(异常处理 + 资源释放)
b. 关键设计:加密:固定密钥+IV(不安全,仅示例),协议:客户端发送 IV(16字节)+ 密文,服务端跳过IV解密
单线程:一次处理一个连接(适合简单场景)
代码如下
import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
key = b'2cbed40efc5cd05b5eddd706d0e1265f'
iv = bytes.fromhex('2cbed40efc5cd05b5eddd706d0e1265f')
def d_m(enc_m):
c = AES.new(key, AES.MODE_CBC, iv)
de = unpad(c.decrypt(enc_m), AES.block_size)
return de.decode('utf-8')
s_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.0.104', 8081)
s_socket.bind(address)
s_socket.listen(5)
print("我们正在listening....", address)
c_socket, client_address = s_socket.accept()
print("we ve received{}connection".format(client_address))
try:
enc_d = c_socket.recv(4097)
if enc_d:
d_d = d_m(enc_d[16:])
print("解密一下,意思是: {}".format(d_d))
else:
print("未收到数据。")
except Exception as e:
print(f"error: {e}")
finally:
c_socket.close()
s_socket.close()
(2).客户端设计思路
a. 核心功能:读取本地文件(file.txt),AES-256-CBC加密(固定IV+密钥)
连接服务端(192.168.0.104:8081),发送加密数据(IV + 密文)
异常处理(文件缺失、连接失败等)
b. 关键设计:加密协议:IV(16字节)拼接密文一起发送,固定密钥(仅示例,实际应用需动态生成)
单次发送(适合小文件,大文件需分块)
代码如下
import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
key = b'2cbed40efc5cd05b5eddd706d0e1265f'
iv = bytes.fromhex('2cbed40efc5cd05b5eddd706d0e1265f')
def enc_m(message):
c = AES.new(key, AES.MODE_CBC, iv)
enc = c.encrypt(pad(message.encode('utf-8'), AES.block_size))
return iv + enc
c_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c_soc.connect(('192.168.0.104', 8081))
path = r'D:\python\file.txt'
try:
with open(path, 'r', encoding='utf-8') as file:
f_c = file.read()
enc_c = enc_m(f_c)
c_soc.send(enc_c)
print("文件内容已加密并发送。")
except FileNotFoundError:
print("文件未找到,请检查路径。")
except Exception as e:
print(f"发生错误: {e}")
finally:
c_soc.close()
3.运行代码如下
4.将代码托管到码云
3. 实验过程中遇到的问题和解决过程
- 问题1:一开始服务器和客户端无法成功通信。
- 问题1解决方案:两端都用我自己电脑连接的局域网的地址就通信成功了。
- 问题2:将代码提交到码云的时候,始终显示没有登陆成功无法提交,但是在登录账户的页面又显示我的账户已经是登陆的。
- 问题2解决方案:把账户删掉,然后重新用之前用过的私人令牌创建账户就登陆成功了。