20162116 2019-2020-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 1621
姓名: 韩浩
学号:20162116
实验教师:王志强
实验日期:2020年5月16日
必修/选修: 公选课
1.实验内容及要求
*(1)创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
*(2)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
*(3)要求包含文件的基本操作,例如打开和读写操作。
*(4)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
*(5)程序代码托管到码云。
2. 实验过程及结果
(1)基本思想
该实验其本质仍为网络编程,使用服务器和客户端进行通信,不过在此基础上添加了文件操作与加解密算法即可。所以我们大致可将逻辑解释为实现通信---读写文件---实现加密---发送信息---接收信息---解密输出,其中对于网络编程的基本框架在课堂上已有详细的介绍和对应的图例,所以我们要做的也只是锦上添花。
(2)代码介绍
*加解密算法
该算法(DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法,已与作为标准的DES区分开来。)其实在python的库中已经有了接口定义,我们要做的仅调用即可,不过在使用函数前要做好相关参数的查询,以防与自己想法有所出入。
def des_encrypt(s):
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):
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
*文件操作
就针对文件操作,其实无非读写二字,其中我们只要谨记对应的读写函数即可,针对写函数我们一般使用file.write(),针对读函数我们一般使用file.read(),要注意的是我们在使用加解密处理的时候不要用readlines(),因为对应的返回值为列表,并不是字符形式。
file = open(r"F:\python编程\1621\162116.txt","a")
file.write("20162116")
choice = input("您是否要写文件(yes or no):")
while choice == "yes":
content = input("请输入您要写的内容:")
file.write(content)
choice = input("您是否要继续添加信息(yes or no):")
file.close()
oth_choice = input("您是否要读文件并传输(yes or no):")
if oth_choice == "yes":
str = file.read()
file.close()
else:
print("谢谢使用!")
*网络编程实现通信
该过程已有明确的框架设计,针对客户端,首先是socket进行模式定义,然后使用connect连接,然后完成信息发送,实现通信过程;而针对服务器就是在connect后进行listen,听取客户端发出信息再进行应答即可。
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',8001))
str = input("请输入要传输的内容:")
s.sendall(str.encode())
data = s.recv(1024)
print(data.decode())
s.close()
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',8001))
s.listen()
conn ,address = s.accept()
data = conn.recv(1024)
print(data.decode())
conn.sendall(("服务器已经收到数据内容:"+ str(data.decode())).encode())
s.close()
(3)结果展示
根据截图可知,成功实现通信过程,并在通信中使用文件操作和DES加解密。
(4)码云链接
https://gitee.com/hanhao16/hanhao17/blob/master/test13.py
https://gitee.com/hanhao16/hanhao17/blob/master/test14.py
3. 实验过程中遇到的问题和解决过程
- 问题1:加解密函数接口数据类型出错
- 问题1解决方案:发现该错误后我的第一反应是通过百度查询des加解密函数所需数据类型是什么,再查看我通过文件操作读出的数据类型是什么进行比照,果不其然,我发现了readlines()返回值并不满足要求,并将该函数改变为read()。
4. 感悟体会
*(1)该实验的内容总体来说比较系统,因为它系统整理了在实验二与该实验三之间所学习知识内容,将文件操作、网络编程等知识由加解密算法为桥梁搭建沟通在一起,实现了知识之间的互联互通,与此同时,也将加解密算法作为花絮内容添加进去,符合我系、我院学习宗旨和学习要求,收获良多;
*(2)该实验是在课程结束后的倒数第二次实验,可以说是给课程在终了时画下一个句号,但其实仔细想想,对于python编程我还得之尚浅,还需要不断地实践中来体悟知识,磨练本领,这样才能让python编程更上一层,有进一步的提高。
参考资料
-
《简明Python教程》
-
《python标准库》
-
...