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到文件内容。”,最终解决了问题。

其他(感悟、思考等)

编程序一定要有耐心,对于一个问题一段时间解决不了不能轻易放弃,可以暂时性略过但是不能就此不管,不然学习漏洞百出,最后难以完成相应的任务
而且需要发散思维,从不同角度看问题,同时也要多咨询老师与同学,他们也许有更多的经验以及解决方案。
还有,多看网上大神的代码,很有帮助。

参考资料