20193102 2019-2020-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级:1931
姓名:李潇敏
学号:20193102
实验教师:王志强
实验日期:2020年5月20日
必修/选修: 公选课
1.实验内容
- 创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
- 要求包含文件的基本操作,例如打开和读写操作。
- 要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
- 程序代码托管到码云。
2. 实验过程及结果
- 这次的实验和之前的作业很像,但由于我对这部分掌握的不是很好,因此直接打开作业和笔记开始拼拼凑凑。。。。(卑微)
- 其实实验过程和之前写作业很像,就一直在查阅笔记,并没有像实验二那样可以向如何计算多项式进一步探索,实验三没有可以更多思考的地方(或者我菜没想到。。),因此过程也没有太多阻碍,半个小时差不多就搞出来了,因为没什么实验过程纠结的点,那直接放代码和结果图吧。
- 客户端的代码
### 文件名:实验三
### 作 者:李潇敏
### 日 期:2020.5.20
import socket
import base64
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8005))
str1 = input("请输入要传输的文件名:")
s.sendall(str1.encode())
with open('message.txt','r')as file:
text = file.read()
text = text.encode('utf-8')
encode_text = base64.b32encode(text)
s.sendall(encode_text)
file.close()
data = s.recv(1024)
print("客户端的信息:", data.decode())
s.sendall("收到".encode())
name = s.recv(1024)
print("客户端的文件:", name.decode())
data = s.recv(1024)
f = open("reply.txt", "w")
f.write(data.decode())
f.close()
print("文件内容已加密发送")
s.sendall("已成功接收!".encode())
s.close()
- 服务器的代码
### 文件名:实验三
### 作 者:李潇敏
### 日 期:2020.5.20
import socket
import base64
#os.chdir(r"D:\li_xiaomin\message")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8005))
s.listen()
conn, address = s.accept()
name = conn.recv(1024)
print("来自客户端的文件:", name.decode())
data = conn.recv(1024)
f = open("receive.txt", "w")
data1 = base64.b32decode(data)
f.write(data1.decode())
f.close()
print("来自客户端加密的信息:", data.decode(), "解密后已保存为receive.txt")
conn.sendall("已接收!".encode())
data1 = conn.recv(1024)
conn.sendall("reply.txt".encode())
f = open("receive.txt", "r")
data1 = f.read()
conn.sendall(data1.encode())
f.close()
data1 = conn.recv(1024)
print("来自客户端的信息", data1.decode())
s.close()
-
客户端运行结果
-
服务器运行结果
3. 实验过程中遇到的问题和解决过程
-
问题1:第一个问题防火墙忘了关闭了
-
问题1解决方案:关闭防火墙
-
问题2:文件无法打开,一直显示有错误
-
问题2解决方案:之前一直用的是file.open()和os.mkdir()但是一直报错,但当我换用with open()as file:就可以正常运行了,因此问题可能是出在关闭文件上,说明我对于open()的应用还有欠缺。
-
问题3:在客户端传入文件内容后,服务器显示的却是字节,不是正常信息
-
问题3解决方案:经过代码检查,发现了在服务器这边的代码解码的过程有问题,修改后可以正常运行
其他(感悟、思考等)
- 这能说这次的实验比较简单,因此将之前讲过的内容稍加整合就可以了,但我知道自己对于socket这部分的知识点还有欠缺,这次的实验代码也是根据之前的作业和笔记写出来的,实际上自己并不能灵活应用这些知识点。总结问题原因,一是因为这部分的代码有点长,而且多了很多必须的部分,比如文件关闭,监听,建立链接这些容易忘记编写导致代码出错。二是因为这部分有点抽象,又是系统又是编码解码的,而且代码都串在一起,导致一行代码很长,因此对于编写逻辑也更难一些。三是因为学习这部分的时候没有提前看完云班课的视频,视频是之后补上的,因此一开始学习的时候就没掌握牢固,这件事情也告诉我们作业越拖要付出的代价也越多,因此拖延症晚期的我以后一定要尽量改掉这个问题。
- 最后当然是赞扬笔记的重要性,我太爱我的笔记了,多次救我于危难之中,让我一次又一次从中找到答案,成功运行代码。
参考资料
- 之前的作业
- 笔记