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

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

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

1.实验内容

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

2. 实验过程及结果

(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
客户端代码:

import socket

# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
server_address = ('localhost', 8888)
client_socket.connect(server_address)

while True:
    # 发送消息给服务器
    message = input('请输入要发送给服务器的消息: ')
    client_socket.send(message.encode('utf-8'))

    # 接收服务器消息
    data = client_socket.recv(1024).decode('utf-8')
    if not data:
        break
    print('服务器说: {}'.format(data))
    # if (input("是否继续Y/N?")=="N"):
    #     break

# 关闭连接
client_socket.close()

服务端代码:

import socket

# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)

# 监听连接
server_socket.listen(1)
print('服务器正在监听 {}:{}'.format(*server_address))

# 接受客户端连接
client_socket, client_address = server_socket.accept()
print('接受来自 {} 的连接'.format(client_address))

while True:
    # 接收客户端消息
    data = client_socket.recv(1024).decode('utf-8')
    if not data:
        break
    print('客户端说: {}'.format(data))

    # 发送消息给客户端
    message = input('请输入要发送给客户端的消息: ')
    client_socket.send(message.encode('utf-8'))
    if input("是否要继续?Y/N")=="N":
        break

# 关闭连接
client_socket.close()
server_socket.close()

获取无线局域网适配器WLAN中的IPv4地址:

代码运行结果:
服务器:

客户端:

(3)加入文件的基本操作,要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
通过AI了解AES-CBC加密模式:

使用代码pip install pycryptodome安装相关库:

在上述基础上更新代码:
客户端

import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os

# 预共享的加密密钥(必须与服务器相同)
KEY = b'ThisIsASecretKey'  # 16字节密钥

def encrypt_message(data):
    """加密文件数据"""
    iv = os.urandom(16)  # 生成随机IV
    cipher = AES.new(KEY, AES.MODE_CBC, iv)
    return iv + cipher.encrypt(pad(data, AES.block_size))

# 创建TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8888)
client_socket.connect(server_address)

# 读取并加密文件
# 确保 file_path 指向一个具体的文件
file_path = r'D:\Python shiyan3 yong'
try:
    with open(file_path, 'rb') as f:
        file_data = f.read()

    encrypted_data = encrypt_message(file_data)

    # 发送加密数据
    client_socket.sendall(encrypted_data)
    print("文件已加密并发送")
except FileNotFoundError:
    print(f"文件未找到: {file_path}")
except PermissionError:
    print(f"没有权限访问文件: {file_path}")
except Exception as e:
    print(f"发生未知错误: {e}")
finally:
    client_socket.close()

服务端

import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os

# 预共享的加密密钥(必须与服务器相同)
KEY = b'ThisIsASecretKey'  # 16字节密钥

def encrypt_message(data):
    """加密文件数据"""
    iv = os.urandom(16)  # 生成随机IV
    cipher = AES.new(KEY, AES.MODE_CBC, iv)
    return iv + cipher.encrypt(pad(data, AES.block_size))

# 创建TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8888)
client_socket.connect(server_address)

# 读取并加密文件
# 确保 file_path 指向一个具体的文件
file_path = r'D:\Python shiyan3 yong'
try:
    with open(file_path, 'rb') as f:
        file_data = f.read()

    encrypted_data = encrypt_message(file_data)

    # 发送加密数据
    client_socket.sendall(encrypted_data)
    print("文件已加密并发送")
except FileNotFoundError:
    print(f"文件未找到: {file_path}")
except PermissionError:
    print(f"没有权限访问文件: {file_path}")
except Exception as e:
    print(f"发生未知错误: {e}")
finally:
    client_socket.close()

(4)程序代码托管到码云。
https://gitee.com/liu-mingyu123456/python

3. 实验过程中遇到的问题和解决过程

  • 问题1:服务端运行错误解密失败: Incorrect IV length (it must be 16 bytes long)
  • 问题1解决方案:询问AI错误原因并在AI的帮助下修改代码
  • 问题2:调用文件运行时显示没有权限访问文件
  • 问题1解决方案:询问AI解决办法,在AI帮助下解决问题

其他(感悟、思考等)

posted @ 2025-04-20 21:24  Camellia×  阅读(42)  评论(0)    收藏  举报