20242115 实验三《Python程序设计》实验报告
20242115 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2421
姓名: 叶抒宇
学号:20242115
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
一、实验内容
- 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
二、实验过程及结果
过程:
- 在IDE中编写服务端和客户端Socket的代码,实现了服务端与客户端之间利用Socket进行通信;
- 编写代码,使用异或对通信内容进行加密;
- 通过git上传至仓库中的ex3-server.py和ex3-client.py。
# ex3-server.py
# Copyright 20242115ysy
import socket
key16 = b'afaksodfjasdfcoi'
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('0.0.0.0', 9999)
server_socket.bind(address)
server_socket.listen(5)
print("开始监听……\n地址:", address)
client_socket, address = server_socket.accept()
print("我们收到客户端{}的连接".format(address))
while True:
data = client_socket.recv(1024)
if not data:
break
tmp1 = bytearray(data)
tmp2 = bytearray(key16 * 64)
data = bytes(bytearray(x ^ y for x, y in zip(tmp1, tmp2))).decode("utf-8")
print("客户端{}说:{}".format(address, data))
data = input("请输入回应:").encode("utf-8")
tmp1 = bytearray(data)
tmp2 = bytearray(key16 * 64)
data = bytes(bytearray(x ^ y for x, y in zip(tmp1, tmp2)))
client_socket.send(data)
client_socket.close()
# ex3-client.py
# Copyright 20242115ysy
import socket
key16 = b'afaksodfjasdfcoi'
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((input("请输入服务端IP:"), int(input("请输入服务端端口号:"))))
while True:
data = input("你想向服务端发什么呢?\n").encode("utf-8")
tmp1 = bytearray(data)
tmp2 = bytearray(key16 * 64)
data = bytes(bytearray(x ^ y for x, y in zip(tmp1, tmp2)))
client_socket.send(data)
data = client_socket.recv(1024)
tmp1 = bytearray(data)
tmp2 = bytearray(key16 * 64)
data = bytes(bytearray(x ^ y for x, y in zip(tmp1, tmp2))).decode("utf-8")
if not data:
break
print("服务端回答:", data)
client_socket.close()
结果:程序运行正常,代码已上传。


三、实验过程中遇到的问题和解决过程
- 问题1:加密时对两个
bytes对象使用^运算符进行异或操作报错 - 问题1解决方案:Python中两个
bytes对象无法直接进行异或运算,应使用bytearray和zip进行操作,如下:
tmp1 = bytearray(data)
tmp2 = bytearray(key16 * 64)
data = bytes(bytearray(x ^ y for x, y in zip(tmp1, tmp2)))
- 问题2:超过
key长度的字节会被截断 - 问题2解决方案:将
key拓展到与缓冲区长度相同,即对16位的key16进行key16 * 64操作
其他(感悟、思考等)
- Python对于Socket的支持较好,进行Socket编程代码量少,方便快捷。
- 加密时要确保被加密的部分与密钥长度一致。
浙公网安备 33010602011771号