20202219 实验三《Python程序设计》实验报告

#20202219 2022Python程序设计》实验三报告

课程:《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

posted @ 2022-05-03 16:03  吴坤泽20202219  阅读(72)  评论(0编辑  收藏  举报