20242115 实验三《Python程序设计》实验报告

20242115 2024-2025-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2421
姓名: 叶抒宇
学号:20242115
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课

一、实验内容

  • 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。

二、实验过程及结果

过程:

  1. 在IDE中编写服务端和客户端Socket的代码,实现了服务端与客户端之间利用Socket进行通信;
  2. 编写代码,使用异或对通信内容进行加密;
  3. 通过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对象无法直接进行异或运算,应使用bytearrayzip进行操作,如下:
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操作

其他(感悟、思考等)

  1. Python对于Socket的支持较好,进行Socket编程代码量少,方便快捷。
  2. 加密时要确保被加密的部分与密钥长度一致。

参考资料

posted @ 2025-04-18 16:34  ysy24  阅读(63)  评论(0)    收藏  举报