20192217 2019-2020-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 1922
姓名: 程子轩
学号:20192217
实验教师:王志强
实验日期:2020年5月16日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。
客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
2. 实验过程及结果
先放代码码云链接:https://gitee.com/python_programming/czx/tree/master/
1.导入需要的模块
import os from socket import * import base64
2.创建客户端与服务端,并选择好端口、缓冲区大小
服务器端
HOST = '127.0.0.1' #对bind()方法的标识,表示可以使用任何可用的地址 PORT = 8001 #设置端口 BUFSIZ = 1024 #设置缓存区的大小 ADDR = (HOST, PORT)
客户端
HOST = '127.0.0.1' PORT = 8001 BUFSIZ = 1024 ADDR = (HOST, PORT)
3.定义套接字,绑定地址
服务器端
tcpSerSock = socket(AF_INET, SOCK_STREAM) #定义了一个套接字 tcpSerSock.bind(ADDR) #绑定地址 tcpSerSock.listen(5) #规定传入连接请求的最大数,异步的时候适用
客户端
tcpCliSock = socket(AF_INET, SOCK_STREAM) tcpCliSock.connect(ADDR)
4.下面进入客户端与服务器端具体代码编写,放图,并着图讲解
客户端
服务器端
首先,我们要传输的文件可能不止一个,故设置while循环,直至输入的文件名为空才跳出循环,
接着我们连接服务端与客户端,为判断是否连接成功,设置一个print来输出状态,
做完这些工作后我们就可以开始收发数据了!
先传输传送的文件的相关信息,如文件名、文件大小等,可按需求进行传输。此时,我设置了一个if语句
,如果用户输入了错误数据或者对应的文件里面是空的,就会跳出此次循环,提醒用户在输出一个正确的由内容的文件名。
这些预备动作完成后,我们正式传输文件里的数据:
打开对应文件,提取文件里的内容,然后
进行加密:
我们已经导入了模块base64,这是一种最简单的对文件的加密方法,具体方法大家可浏览相关文档:
https://blog.csdn.net/zyz511919766/article/details/22681399?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
把加密后的内容发送到客户端进行解密,并保存到一个新的文件中。
这样就完成啦!
**小提示:1.记得加密也要对应解密,不要忘了。
2.我用的这种原始的文件操作方法在write后,一定要先close(),再open()、read(),否则无法read到文件内容。
3.最后不要忘记close(),不然占用着内存还是有一定风险。
4.最好在过程中多做一些print()便于发现代码中的bug。
结果展示:
3. 实验过程中遇到的问题和解决过程
-
问题1:编码与解码问题
-
问题1解决方案:记住xxx.xxx.xxx是有先后顺序的,不能有如:f.decode().read() 这样的操作,一定是f.read().decode()
-
问题2:客户端能接受到服务端发送的文件信息,但收不到文件的密文(这问题整死我了)。
-
问题2解决方案:因为代码运行时没有报错,没有错误信息所以处理起来更加棘手。
通过debug定位到问题出在了服务器的第33行代码上,但无从下手修改,在网上找了好多东西也解决不了。后来通过询问老师与同学,按照老师
的办法将关键代码拉出来debug修改,经过一天的努力终于发现了错误所在,即小tips里提到的“在write后,一定要先close(),再open()、read(),否则无法read到文件内容。”,最终解决了问题。
其他(感悟、思考等)
编程序一定要有耐心,对于一个问题一段时间解决不了不能轻易放弃,可以暂时性略过但是不能就此不管,不然学习漏洞百出,最后难以完成相应的任务
而且需要发散思维,从不同角度看问题,同时也要多咨询老师与同学,他们也许有更多的经验以及解决方案。
还有,多看网上大神的代码,很有帮助。
参考资料
- 蓝墨云班课python教学
- https://blog.csdn.net/zyz511919766/article/details/22681399?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase base64库应用方法
- CSDN、博客园里的很多关于socket的文章