实验三
(一)实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(二)实验要求
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
(三)实验报告
课程:《Python程序设计》
班级: 1931
姓名: NO WAY
学号:20193120
实验教师:NO WAY
实验日期:2020年5月16日
必修/选修: 公选课
1.实验内容
client端:先对消息进行加密,再发送加密后消息。
sever端:接收client发来的消息,然后解密,将解密后的内容放到文件中。
2. 实验过程及结果
client端:
1:与server端进行连接,并处理需要传送的内容。
2:用户将需要传送的内容写到指定文件中,然后保存,运行代码即可进行传输。
3:在client端进行加密,将加密后的内容整合成一个字符串,编码后统一传输过去。
server端:
1:与client端进行连接,传输内容。
2:编写代码进行解码。其中专门设置一个函数“decode”进行解码,返回值为解密好的内容。
3:打开一个新的文件,将解密好的内容写到文件中。
(之后一定要记得写file.close()!!!)
运行:
先运行server端,再运行client端。结果如下:
字符通过加密的形式成功传输,并被server端进行解密,解密之后内容被放到了新的文件当中。
3. 实验过程中遇到的问题和解决过程
-
问题1:加密方案
-
问题1解决方案:
为防止加密后的字符超过ASCII码的范围,所以对ASCII码值小于125的字符进行加密。
另外,对原来的\'\\n\'进行加密的时候,会出现系统无法识别(正方形中有一个问号)的情况,所以不对转行字符进行加密。 -
问题2:无法处理读取后的文件
-
问题2解决方案:因为读取完文件之后,没有写file.close(),所以无法删除
只需要在读取完成之后,加上file.close()即可 -
问题3:传输和解码问题
问题3解决方案:
对于传输问题,先把加密后的每一个字符用空格隔开,然后编码成二进制之后,用sendall全部送过去。
解码问题,server端收到之后,先进行decode获得密文,再用split函数,以空格为间隔,将发过来的每个字符单独拆分成一个列表元素,然后server端的密钥进行一一解码。
-
问题4:附加bug
原因:在用ASCII码关系解密的时候,遇到了空字符串,无法解密,系统报错。
解决办法:因为列表的最后元素是空字符串,所以会报错。只需这样修改即可修复bug:
for i in range(len(unknown)-1):
或者在解密部分这样修改:
elif ord(unknown[i]) <= 125 and unknown[i] != \'\':
修改后,程序正常运行。
sever端和client端的码云:https://gitee.com/i_am_yu/exp3
其他(感悟、思考等)
1:上述加密办法属于简单的加密办法,类似于凯撒密码,很容易被破解,需要用高级加密算法才能避免其被轻松破解。
2:目前只能对ASCII字符进行加密,遇到其他不属于ASCII码范围的字符,例如中文字符,则无能为力。
3:QQ能做到上传各种文件到群文件或者传输给其他人。如果可能的话,还可以增加传输其他类型文件的功能,这个代码目前只支持传输txt文件。