20212218林思凡 实验三《Python程序设计》实验报告

 # 20212218 2021-2022-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2122
姓名: 林思凡
学号:20212218
实验教师:王志强
实验日期:2022年5月2日
必修/选修: 公选课

## 1.实验内容
运用socket模块,运用base64解码加密实现加密传输
## 2. 实验过程及结果
1.认识socket:Socket(又称套接字)起源于Unix,是应用层与TCP/IP协议族通信的中间软件抽象层。复杂的TCP/IP协议族隐藏在了Socket接口内部,用户只需要简单地使用Socket接口来进行网络编程。应用程序通常是通过Socket向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
2.(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序:
服务端:
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8001))
s.listen()
conn, address = s.accept()
data = conn.recv(1024)
print(data.decode())

conn.sendall(("The sever has received the data: " + str(data.decode())).encode())
s.close()

 

客户端:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8001))
str = input("Please input the message: ")
s.sendall(str.encode())
data = s.recv(1024)
print(data.decode())
s.close()

 

运行结果:

 

 

 

 

 

 

(2)要求包含文件的基本操作,例如打开和读写操作;发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
加密算法:base64解码(通过CSDN博主「无名无奈」了解)

Base64编码的思想是:采用64个基本的ASCII码字符对数据进行重新编码。

①将需要编码的数据拆分成字节数组,以3个字节为一组,按顺序排列24位数据,再把这24位数据分成4组,即每组6位;

②再在每组的的最高位前补两个0凑足一个字节,这样就把一个3字节为一组的数据重新编码成了4个字节;

③当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节,这时在最后一组填充1到2个0字节,并在最后编码完成后在结尾添加1到2个=号。

改进代码
服务端:
import socket
import base64

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8001))
s.listen()
conn, address = s.accept()
data = conn.recv(1024)
file1 = open("s_test.txt", "w")
c1 = base64.b32decode(data)
file1.write(c1.decode())
file1.close()

print("Receive encoded messages from client: ", data.decode(), "\nAlready decoded in the file.")
conn.sendall("Received already.".encode())
c1 = conn.recv(1024)
print("Message from the client:", c1.decode())
s.close()

 

客户端:

import socket
import base64

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8001))
text = input("Please input the message:")
file2 = open("c_text.txt", "a+")
file2.write(text)
print('written already.')
text = text.encode('utf-8')
encode_text = base64.b32encode(text)
s.sendall(encode_text)
file2.close()
data = s.recv(1024)
print("messages from client", data.decode())
s.sendall("Receive.".encode())
print("File has been sent.")
s.sendall("Receive already.".encode())
s.close()

 

运行代码:

客户端:

 服务器:

 出现文本文件:

 

 

 

 

则说明文件传输成功。

(3)程序代码托管到码云。

 

 

 

## 3. 实验过程中遇到的问题和解决过程
- 问题1:不知道如何加密
- 问题1解决方案:上CSDN学习加密算法base64解码,并询问了计算机编程能力强的同学。
- 问题2:对socket套接字了解不够
- 问题2解决方案:上b站浏览相关视频,对socket有了一定的了解。


## 其他(感悟、思考等)

socket套接字是计算机网络通信不可缺少的一部分,是“一切皆为文件”的实现形式,我们要好好应用socket,丰富计算机通信的发展。

## 参考资料

-  [TCP/IP网络通信之Socket编程入门](TCP/IP网络通信之Socket编程入门_哔哩哔哩_bilibili)

 
posted @ 2022-05-03 16:10  特别中二的文年同学  阅读(19)  评论(0编辑  收藏  举报