20193117 2019-2020-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级:1931
姓名:韦皓铭
学号:20193117
实验教师:王志强
实验日期:2020年5月20日
必修/选修: 公选课
1.实验内容
-
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
-
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
-
(2)要求包含文件的基本操作,例如打开和读写操作。
-
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
-
(4)程序代码托管到码云。
2. 实验过程及结果
客户端
import socket
import base64
import time
timeout = 20
socket.setdefaulttimeout(timeout)
sleep_download_time = 10
time.sleep(sleep_download_time)
path="C:\\Users\\whm\\Desktop\\python\\test\\56.txt"
file=open(path,'r')
str1=file.readlines()
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',6885))
with open(r"C:\Users\whm\Desktop\python\test\56.txt", 'r',encoding='UTF-8') as t:
data=t.readline().encode()
based_data1 = base64.b64encode(data)
print(based_data1)
with open(r"C:\Users\whm\Desktop\python\test\56.txt", 'wb') as t:
t.write(based_data1)
with open(r"C:\Users\whm\Desktop\python\test\56.txt", 'rb') as t:
for i in t:
s.send(i)
data = s.recv(1024)
break
s.send('quit'.encode())
print("解密:")
file = s.recv(1024)
with open('file', 'r', encoding='UTF-8') as t:
print(t.readline())
t.close()
服务端
import socket
import struct
import base64
FILEINFO_SIZE=struct.calcsize('128s32sI8s')
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',6885))
s.listen(5)
conn,address=s.accept()
print("文件接收中")
with open('file', 'ab' ) as t:
data = conn.recv(1024)
if data == b'quit':
breakpoint()
t.write(data)
conn.send('success'.encode())
print("加密后:")
with open('file', 'r',encoding='UTF-8') as t:
based_data1= t.readline().encode('gbk')
print(based_data1)
plain_data1 = base64.b64decode(based_data1)
open("file", "w").close()
with open('file', 'wb') as t:
t.write(plain_data1)
print("解密后:")
with open('file', 'r',encoding='UTF-8') as t:
print(t.readline())
with open("file",'rb') as f:
for i in t:
conn.send(i)
data=conn.recv(1024)
break
s.close()
3. 实验过程中遇到的问题和解决过程
- 问题一:遇到byte无法读取问题
- 问题一解决方案:转化为str形式
- 问题二:客户端被强迫拒绝访问
- 问题二解决方案:关闭系统内所有防火墙
其他(感悟、思考等)
本次实验进行的客户端与服务端的本地传输实验,通过建立服务器的链接,搞清了代码编程的连接原理,并且了解了编码形式的转化问题,破解防火墙的阻拦,收益良多。