《Python程序设计》实验三报告

1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过socket套接字(tcp/udp)进行通信。
要求:
(1)创建服务端和客户端,选择一个通信端口,用python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
2. 实验过程及结果
(1)设计思路
该实验目标是制作一个基于socket的通讯器,根据之前课上学习的内容及课后作业,本次实验不难完成。
加密上选择的是基于pydes的cbc模式des加密,实现了客服端与服务器的双向加密通信。基于python标准库tkinter,实现了可视化选择目标文件的功能。但由于没有具体实现tkinter窗体(极其不标准的使用方法),导致使用该功能后会有一个无内容的tkinter窗体残留,虽然不影响总体使用,但对程序的完成性和一致性有所破坏。
(2)主要代码介绍
部分代码有参考。
报告中只贴出了部分代码,全部代码已上传码云:服务器部分,客户端部分,des加解密部分
加解密部分:
基于pydes库实现des加解密功能。
from pydes import des, cbc, pad_pkcs5
import binascii
key_ = ‘12345675’
def des_encrypt(s):
“”“
des 加密
:param s: 原始字符串
:return: 加密后字符串,16进制
”“”
secret_key = key_
iv = secret_key
k = des(secret_key, cbc, iv, pad=none, padmode=pad_pkcs5)
en = k.encrypt(s, padmode=pad_pkcs5)
return binascii.b2a_hex(en)
def des_descrypt(s):
“”“
des 解密
:param s: 加密后的字符串,16进制
:return: 解密后的字符串
”“”
secret_key = key_
iv = secret_key
k = des(secret_key, cbc, iv, pad=none, padmode=pad_pkcs5)
de = k.decrypt(binascii.a2b_hex(s), padmode=pad_pkcs5)
return de
客户端部分:
循环发送字符串给服务器。取‘close_’作为关闭连接的保留字。
import socket
from mydes import des_descrypt, des_encrypt
from tkinter.filedialog import askopenfilename
if __name__ == ‘__main__’:
s = socket.socket(socket.af_inet, socket.sock_stream)
s.connect((‘127.0.0.1’, 8001))
print(‘连接服务器成功’)
while true:
ch = input(‘1.发送字符串 2.发送文件 3.退出\n请选择想要使用的功能:’)
if ch == ‘1’:
str_ = input(‘请输入要传输的内容:’)
elif ch == ‘2’:
filename = askopenfilename()
with open(filename, ‘r’, encoding=‘utf-8’) as f:
str_ = f.read()
elif ch == ‘3’:
str_ = ‘close_’
str_ = des_encrypt(str_)
s.sendall(str_)
break
else:
print(‘无该选项,请重新输入’)
str_ = des_encrypt(str_)
# print(type(str_))
s.sendall(str_)
data = s.recv(1024)
data = des_descrypt(data)
print(data.decode())
s.close()
print(‘连接已关闭’)
服务器部分:
循环接收客户端发送的数据,并写入文件中。取‘close_’作为关闭连接的保留字。
import socket
from mydes import des_descrypt, des_encrypt
if __name__ == ‘__main__’:
s = socket.socket(socket.af_inet, socket.sock_stream)
s.bind((‘127.0.0.1’, 8001))
print(‘服务器已创建,正在监听中。..’)
s.listen()
conn, address = s.accept()
while true:
data = conn.recv(1024)
data = des_descrypt(data)
# print(data, type(data))
if data == b‘close_’:
break
else:
with open(‘received’, ‘wb’) as f:
f.write(data)
str_ = ‘服务器已接收:’+str(data)
str_ = des_encrypt(str_.encode())
conn.sendall(str_)
print(‘接收数据:’, data.decode(), ‘\n已写入received.txt文件中’)
s.close()
print(‘服务器关闭’)
(4)程序结果
客户端:
发送字符串:
发送文件
结束连接
服务器:

OcleanOne电动牙刷体验评测 到底好不好用
SPARK语言可否取代 C语言?
CMMB演义:世界是平的
开启神奇小宇宙 这样的手机玩法第一次见
专业全景相机开始选用SSD固态硬盘作为存储方案
《Python程序设计》实验三报告
丝杆支撑座的优势
注射器防止重复使用回推测试仪
恶劣和极端环境中的PCB - 如何定义极端环境
汽车应用中的电机驱动设计实例
吉利与FF联手,两个“疯子”的梦想秀,20亿能让贾跃亭梦想成真?
到底哪个国家的5G芯片最强?
PADS 9.0新增的无模命令Z 的使用详解
河北联通在雄安新区首次发布了5G品牌标识5Gn以及7+33+n 5G网络部署
光纤连接器清洁规则及方法
英特尔Agilex 3 FPGA产品家族介绍
2020年第一季度智能家居和智能配件领域的收入同比增长了22.5%
PCB/PCBA失效分析
Fluke TiX560红外热像仪荣膺EC&M 2016年度产品奖
林肯MKC中网造型犹如一直展翅高飞的鸟,运动感很强,性能完爆路虎神行