“20242113 实验三《Python程序设计》实验报告”

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

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

1.实验内容

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

II.实验要求

(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。

2. 实验过程及结果

I.环境准备

II.创建客户端

import socket
from cryptography.fernet import Fernet

# 必须与服务端使用相同密钥
key = b'pRmgMa8T0INjEAfksaq2aafzoZXEuwKIvDCD8gZW8ek='
cipher = Fernet(key)


def send_file(host):
    port = 12345

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))

        # 读取并发送文件
        try:
            with open('client_input.txt', 'rb') as f:
                file_data = f.read()

            encrypted_data = cipher.encrypt(file_data)
            s.send(len(encrypted_data).to_bytes(4, byteorder='big'))
            s.sendall(encrypted_data)
            print(f"已发送 {len(file_data)} 字节原始数据")

            # 接收回复
            resp_len = int.from_bytes(s.recv(4), byteorder='big')
            encrypted_resp = s.recv(resp_len)
            decrypted_resp = cipher.decrypt(encrypted_resp)

            with open('client_response.txt', 'wb') as f:
                f.write(decrypted_resp)
            print(f"已接收 {len(decrypted_resp)} 字节回复数据")

        except FileNotFoundError:
            print("错误:未找到输入文件")


if __name__ == '__main__':
    server_ip = input("请输入服务端IP地址: ")
    send_file(server_ip)

III.创建服务端

import socket
from cryptography.fernet import Fernet

# 使用预共享密钥进行加密解密
key = b'pRmgMa8T0INjEAfksaq2aafzoZXEuwKIvDCD8gZW8ek='
cipher = Fernet(key)


def handle_client(conn):
    # 接收数据长度信息
    data_len = int.from_bytes(conn.recv(4), byteorder='big')
    encrypted_data = conn.recv(data_len)

    # 解密数据
    try:
        decrypted_data = cipher.decrypt(encrypted_data)
    except:
        decrypted_data = b"Decryption Error"

    # 写入接收文件
    with open('server_received.txt', 'wb') as f:
        f.write(decrypted_data)
    print(f"已接收并保存 {len(decrypted_data)} 字节数据")

    # 读取回复文件并发送
    try:
        with open('server_response.txt', 'rb') as f:
            response_data = f.read()
        encrypted_resp = cipher.encrypt(response_data)
        conn.send(len(encrypted_resp).to_bytes(4, byteorder='big'))
        conn.sendall(encrypted_resp)
    except FileNotFoundError:
        print("警告:未找到回复文件")


def main():
    host = '0.0.0.0'
    port = 12345

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((host, port))
        s.listen()
        print("服务端已启动,等待连接...")

        while True:
            conn, addr = s.accept()
            with conn:
                print(f"连接来自: {addr}")
                handle_client(conn)


if __name__ == '__main__':
    main()

首先,运行服务器端代码。它将绑定到指定的地址和端口,并开始监听连接请求。
当你看到输出
时,表示服务器已经开始监听连接请求了。
当你看到输出连接来自 127.0.0.1:52937 时,表示客户端已经成功连接到服务器。

IV.进行对话测试

客户端输入 文件

服务端保存 文件

V.局域网实现

(注:和韩子杰同学在同一WiFi下实现链接,服务器IP为192.168.10.145,端口选择:1390)

VI.代码提交码云

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

  • 问题1:程序无法运行报错
  • 问题1解决方案:询问AI得知有包未安装,进行安装
  • 问题2:初次调试程序返回报错
  • 问题2解决方案:检查条件知道原因为未创建返回文件,故创建返回文件

其他(感悟、思考等)

这个实验提供了一个简单的交互体验,可以在客户端输入消息并得到服务器端的响应。这种交互方式类似于实际应用中的聊天系统或实时通信应用,可以作为学习网络编程的起点。是学习网络编程的一个很好的起点,通过它可以初步了解网络通信的基本原理和实现方式,为进一步探索网络编程打下基础。

参考资料

posted @ 2025-04-16 23:10  陈独之  阅读(34)  评论(0)    收藏  举报