20191318实验三 Socket编程技术
20191318 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 1913
姓名: 王泽文
学号:20191318
实验教师:王志强
实验日期:2020年4月11日
必修/选修: 公选课
1. 实验内容
- 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
2. 实验过程及结果
- 使用
socket
模块进行编写客户端和服务端,并使用base64
对文件进行加密
服务端代码如下
import socket import base64 def base64_decode(name, ciphertext): ciphertext = ciphertext.encode('utf-8') ciphertext = base64.b64decode(ciphertext) result = ciphertext.decode('utf-8') f0 = open(name, "w+") f0.write(result) f0.close() return result print("正在等待连接。。。。") while True: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('192.168.137.1', 800)) s.listen() conn, address = s.accept() txet = conn.recv(1024) print(txet.decode('utf-8')) data0 = conn.recv(1024) if data0.decode('utf-8') == "对方已退出": print(data0.decode('utf-8')) s.close() elif data0.decode('utf-8') == "正在发送文件": print("正在接收文件。。。。") name = conn.recv(1024) data = conn.recv(1024) base64_decode(name.decode('utf-8'), data.decode('utf-8')) print("已接收:"+name.decode('utf-8')) conn.sendall("发送成功".encode('utf-8')) else: print("客户端:"+data0.decode('utf-8')) conn.sendall(("服务端已接收:" + str(data0.decode('utf-8'))).encode('utf-8'))
客户端代码如下
import socket import base64 def base64_encode(ad, name): f0 = open(ad + name, "r+") str = f0.read() pp = str.encode('utf-8') pp = base64.b64encode(pp) pp = pp.decode('utf-8') return pp while True: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.137.1', 800)) s.sendall("连接成功".encode('utf-8')) a = int(input("1.通信 2.传输文件 3.退出\n请输入:")) if a == 1: str = input("输入:") s.sendall(str.encode('utf-8')) data = s.recv(1024) print(data.decode('utf-8')) elif a == 2: s.sendall("正在发送文件".encode('utf-8')) ad = input("请输入文件地址:") name = input("请输入文件名:") s.sendall(name.encode('utf-8')) str = base64_encode(ad, name) s.sendall(str.encode('utf-8')) data = s.recv(1024) print(data.decode('utf-8')) else: str = "对方已退出" s.sendall(str.encode('utf-8')) print("已退出") s.close() break
运行效果如图
客户端
服务端
代码链接https://gitee.com/python_programming/wzw20191318/commit/608c38547522b6349c78efde93dece5195aef673
3. 实验过程中遇到的问题和解决过程
- 在socket接收时只能接收一次数据
解决方法:每一次sendall都需要一次recv来接收
4. 思考和感悟
- socket模块有很多有意思的东西,我还需要更深入的去学习。