20202219 实验三《Python程序设计》实验报告
课程:《Python程序设计》
班级: 2022
姓名: 吴坤泽
学号:20202219
实验教师:王志强
实验日期:2020年4月21日
必修/选修: 公选课
## 1.实验内容
(一)创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(二)实验要求
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
## 2. 实验过程及结果
①创建服务端和客户端,实现通信:
服务端代码:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #参数1:服务器之间网络通信;参数2:流式 #s = socke.socket() s.bind(('127.0.0.1', 8001)) #绑定. localhost = 127.0.0.1 . part = 0-65535 s.listen() #监听 conn, address = s.accept() #阻塞 data = conn.recv(1024) #接收 print(data.decode()) #print(data) conn.sendall(("服务器已经接收到了数据内容"+str(data.decode())).encode()) s.close()
客户端代码:
import socket s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(('127.0.0.1',8001)) #连接,元组的形式,(IP地址,端口) str = input("请输入要传输的内容:") s.sendall(str.encode()) data = s.recv(1024) print(data.decode()) s.close()
下面先运行服务端,然后再运行客户端,能够运行成功:
②发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中:
从网上搜集了一些资料,以及自己自学了一点后,从网上知道了Python加密可以下载一个Crypto.Cipher包来进行加密。
在电脑Dos界面输入:
pip install pycryptodome
显示:
但是当我在程序里调用这个包的时候,却显示错误:
点击错误报告告诉我没有安装这个包,再在Pycharm上安装这个包后,还是同样告诉我错误,去网络上搜索解决方案,先是告诉我找到Crypto这个文件夹,当我找到并修改后
发现还是会继续报错:
然后又去搜索解决方法:
我发现我确实没有Cipher这个文件夹,所以根据这个博主提供的链接,下载了这个文件夹的压缩包,并解压在我电脑正确的目录:
这时候去Pycharm里,发现代码不报错了,成功解决了问题。
服务器端代码:
import socket import base64 from Crypto.Cipher import AES def add_to_16(value): while len(value) % 16 != 0: value += '\0' return str.encode(value) def decrypt_oralce(): key = input('\n请输入用于解密文件的秘钥:') global filepath global savefile savefile = input('\n请输入解密后文件的名字:') text = str(open(filepath, 'r').read()) open(filepath, 'r').close() aes = AES.new(add_to_16(key), AES.MODE_ECB) # 初始化加密器 base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8')) decrypted_text = str(aes.decrypt(base64_decrypted)).replace('\0', '') logbat = open(savefile, 'w') logbat.write(decrypted_text) logbat.close() print('\n文件解密成功 文件已保存为 ', savefile) s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('127.0.0.1', 8008)) s.listen(5) print('Waiting for connection...') while True: sock, addr = s.accept() filepath = input('please enter the filepath you want to save:') f = open(filepath, 'wb') data = sock.recv(1024)#接收文件内容 f.write(data) f.close() if __name__ == '__main__': decrypt_oralce() break s.close()
客户端代码:
import socket import os import base64 from Crypto.Cipher import AES def add_to_16(value): while len(value) % 16 != 0: value += '\0' return str.encode(value) def encrypt_oracle(): filename = input('please enter the filename you want to send:') key = input('\n请设置一个秘钥用于加密文件:') filepath,fname = os.path.split(filename) filename1,extension = os.path.splitext(fname) global savefile savefile = filename1+'已加密'+extension#加密后文件名称 text = open(filename, 'rb') text.read() text.close() text = str(text) aes = AES.new(add_to_16(key), AES.MODE_ECB) encrypt_aes = aes.encrypt(add_to_16(text)) encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') logbat = open(savefile, 'w') logbat.write(encrypted_text) logbat.close() print('\n文件已加密为', savefile) if __name__ == '__main__': encrypt_oracle() filesize = str(os.path.getsize(savefile)) fname1, fname2 = os.path.split(savefile) f = open(savefile, 'rb') cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) cs.connect(('127.0.0.1', 8008)) while True: for line in f: cs.send(line)#发送文件内容 print('sending...') break cs.close()
虽然不报错了,但是还是不能运行(崩溃了)。。。:
应该是那个包里代码出了问题。。。。。
所以就换了代码:
运行结果如下:
③将代码上传到git:
## 3. 实验过程中遇到的问题和解决过程
- 问题1:python加密算法
- 问题1解决方案:上网查找
- 问题2:调用包不能够调用
- 问题2解决方案:上网查找解决方案,但还是不能解决(难受)
## 其他(感悟、思考等)
通过本次实验,我了解到Socket编程技术,也知道了怎样调用包里的资源,也知道了Python加密的方法。
## 参考资料
- from Crypto.Cipher import AES找不到模块报错的解决方案记录
https://blog.csdn.net/sinat_41870148/article/details/121334965?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165156102416781685349705%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165156102416781685349705&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-13-121334965.142^v9^control,157^v4^control&utm_term=crypto.cipher%E5%AE%89%E8%A3%85&spm=1018.2226.3001.4187
- python pycharm导入Crypto.Cipher失败的解决方法
https://blog.csdn.net/qq_45773419/article/details/118631423?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165156270816781432963288%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165156270816781432963288&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-118631423.142^v9^control,157^v4^control&utm_term=crypto.cipher%E6%8A%A5%E9%94%99&spm=1018.2226.3001.4187