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

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

课程:《Python程序设计》
班级: 2312
姓名: 蔡明辉
学号:20231213
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课

1.实验内容

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

2. 实验过程及结果

设计完成基本的交互操作
服务端

import socket
def client():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '127.23.12.13'
    port = 12345
    client_socket.connect((host, port))
    print("连接到服务器")
	while True:
        message = input("发送消息:")
        client_socket.send(message.encode('utf-8'))
        if message == 'exit':
            print('服务端终止通信')
            break

        response = client_socket.recv(1024).decode('utf-8')
        print(f"收到服务器消息:{response}")
        if response == 'exit':
            break
    client_socket.close()

client()

客户端

import socket

def server():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '127.23.12.13'
    port = 12345
    server_socket.bind((host, port))
    server_socket.listen(5)
    print(f"服务器正在监听 {host}:{port}")

    client_socket, addr = server_socket.accept()
    print(f"收到连接来自:{addr}")
    #通信
    while True:
        message = client_socket.recv(1024).decode('utf-8')
        if message == 'exit':
            print("客户端请求退出")
            break
        print(f"收到客户端消息:{message}")
        
        response = input("服务端回复:")
        client_socket.send(response.encode('utf-8'))
        if response == 'exit':
            break
    client_socket.close()
    server_socket.close()
server()

增添文件的传输和接收存储功能

#
with open('message_to_send.txt', 'r') as file:
    message = file.read()
    message = message.encode('utf-8')
    client_socket.send(message)
#
message = client_socket.recv(1024)
message = message.decode('utf-8')
    with open('message.txt', 'w') as file:
        file.write(message)
    print("消息已保存到文件")

增添加密和解密功能,此处使用简单实现的凯撒密码加密

def encrypt_message(message, shift = 3):
    charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{}|;:',.<>?/"
    encrypted = ''
    
    for char in message:
        if char in charset:
            idx = charset.index(char)
            new_idx = (idx + shift) % len(charset)
            encrypted += charset[new_idx]
        else:
            encrypted += char
    
    return encrypted

def decrypt_message(encryptedmessage, shift = 3):
    return encrypt_message(encryptedmessage, -shift)

#客户端
with open('message_to_send.txt', 'r') as file:
        message = file.read()
    encrypted_message = encrypt_message(message).encode('utf-8')
    client_socket.send(encrypted_message)
    print("加密消息已发送")
#服务端
    #密文
    encrypted_message = client_socket.recv(1024)
    message = encrypted_message.decode('utf-8')
    with open('message.txt', 'w') as file:
        file.write(message)
    print("加密后消息已保存到文件")

    #解密
    decrypted_message = decrypt_message(encrypted_message.decode('utf-8'))
    with open('received_message.txt', 'w') as file:
        file.write(decrypted_message)
    print("消息已解密并保存到文件")

运行结果
客户端与服务端:
image
image
客户端收到服务端消息后存储,实现密文的接收和解密:
image

代码:
https://gitee.com/cloud-lumiere/2025-python-course/blob/master/实验三服务端.py
https://gitee.com/cloud-lumiere/2025-python-course/blob/master/实验三客户端.py

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

  • 问题1:在初步测试时出现OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
  • 问题1解决方案:原因是测试后未及时结束程序运行,测试时用新终端运行程序,导致地址被占用。
  • 问题2:使用老师提供的加密函数时,出现ImportError: cannot import name 'decrypt_message' from 'crypto
  • 问题2解决方案:根据已经掌握的密码学知识,自行设计了简单的凯撒密码加密,完成了加密和解密的实验内容

其他

本次实验恰与正在学习的信息安全和计算机网络相关,通过wireshark抓包明文和密文分析,加深了对信息安全的认识
通过学习socket编程,加深了对TCP/IP网络的理解

参考资料

posted @ 2025-04-20 15:14  lumiere_cloud  阅读(29)  评论(0)    收藏  举报