20204311 《Python程序设计》 实验三 Socket编程技术实验报告
简介
- 实验名称:Socket编程技术
- 课程:《Python程序设计》
- 班级: 2043
- 姓名: 曲经民
- 学号:20204311
- 实验教师:王志强
- 实验日期:2021年5月
- 必修/选修: 选修课
实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
实验要求
1.创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
2.要求包含文件的基本操作,例如打开和读写操作。
3.要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
4.程序代码托管到码云。
实验过程及结果
一. 实现应用的关键步骤设计
1.1 Socket 类型
- 套接字格式:socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。
1.2 Socket 函数
注意点:
- TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。
- 服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。
1.3 Socket 编程模板
TCP服务端:
1 创建套接字,绑定套接字到本地IP与端口
socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.bind()
2 开始监听连接
s.listen()
3 进入循环,不断接受客户端的连接请求
s.accept()
4 然后接收传来的数据,并发送给对方数据
s.recv()
s.sendall()
5 传输完毕后,关闭套接字
s.close()
TCP客户端:
1 创建套接字,连接远端地址
socket.socket(socket.AF_INET,socket.SOCK_STREAM) , s.connect()
2 连接后发送数据和接收数据 # s.sendall(), s.recv()
s.sendall()
s.recv()
3 传输完毕后,关闭套接字
s.close()
二. 代码编写及调试运行
2.1 TCP服务端代码
import socket
import base64
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8010))
s.listen()
conn, address = s.accept()
data = conn.recv(1024)
f = open("receive.txt", "w")
data1 = base64.b32decode(data)
f.write(data1.decode())
f.close()
print("收到来自客户端加密的信息:", data.decode(), "\n已解密至receive文件中")
conn.sendall("已接收!".encode())
data1 = conn.recv(1024)
print("来自客户端的信息", data1.decode())
s.close()
2.1 TCP客户端代码
import socket
import base64
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8010))
text = input("请输入要传输的内容:")
file = open('send.txt', 'a+')
file.write(text)
print('内容已写进文件')
text = text.encode('utf-8')
encode_text = base64.b32encode(text)
s.sendall(encode_text)
file.close()
data = s.recv(1024)
print("客户端的信息:", data.decode())
s.sendall("收到".encode())
print("文件内容已加密发送")
s.sendall("已接收!".encode())
s.close()
2.3 调试运行
三. 将代码上传码云
https://gitee.com/jam12138/socket
感悟思考
- 经历本次实验,我首先感受到的是要学会灵活运用Python中的网络编程模块,这能使程序功能更完善。
- 其次是本次实验中我出现了很多粗心的错误,这要求我要更加细心,避免出现低级错误。
- 这次实验也让我认识到只有通过实践实验操作才能将理论知识更好地运用起来,在日后的Python程序设计的课程学习过程中,我要注意实际实验的重要性。