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

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

课程:《Python程序设计》
班级: 2412
姓名: 黄迅
学号:20241217
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课

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

二、实验过程及结果
(一)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序
1.学习socket编程技术

2.代码如下
客户端代码

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('172.30.1.100', 9999))
while True:
    message = input("客户端说:").strip()
    client_socket.send(message.encode('utf-8'))
    data = client_socket.recv(1024)
    decoded_data = data.decode('utf-8')
    print("服务端回答", decoded_data)

服务端代码

import socket

# 新建服务端socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('172.30.1.220', 8888)
server_socket.bind(address)
server_socket.listen(5)


client_socket, client_address = server_socket.accept()
print("我们收到{}的连接".format(client_address))

while True:
    data = client_socket.recv(1024)
    if not data:
        break

    decoded_data = data.decode('utf-8')
    print("客户端说:{}".format(decoded_data))
    response = input("服务端回应:")

    client_socket.send(response.encode('utf-8'))

client_socket.close()
server_socket.close()

3.运行结果截图:
客户端

服务端

(二)要求包含文件的基本操作,例如打开和读写操作(选做)
(三)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中
1.完整代码
发送方

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(('172.16.230.177', 8000))

# 定义异或加密使用的密钥,要和服务端一致
key = 0x55

while True:
    try:
        # 从文件读取内容
        with open('message.txt', 'r', encoding='utf-8') as f:
            content = f.read()
        # 将字符串转为字节,再进行异或加密
        content_bytes = content.encode('utf-8')
        encrypted_content = bytes([byte ^ key for byte in content_bytes])
        
        client.send(encrypted_content)

        # 接收服务端的消息并解密
        encrypted_response = client.recv(1024)
        decrypted_response = bytes([byte ^ key for byte in encrypted_response])
        response_message = decrypted_response.decode('utf-8')
        print(f'服务端消息: {response_message}')

        choice = input('是否继续发送消息 (y/n): ')
        if choice.lower() != 'y':
            break
    except FileNotFoundError:
        print('未找到 message.txt 文件,请创建该文件并写入内容。')
        break
    except UnicodeDecodeError:
        print('文件编码格式不兼容,请确保文件以 utf-8 编码保存。')

client.close()

接收方

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(('172.16.220.184', 8000))

server.listen(1)
print('服务端正在监听端口8000...')

conn, addr = server.accept()
print(f'连接来自: {addr}')

# 定义异或加密使用的密钥
key = 0x55

while True:
    # 接收客户端发送的密文
    encrypted_data = conn.recv(1024)
    if not encrypted_data:
        break

    # 进行异或解密
    decrypted_data = bytes([byte ^ key for byte in encrypted_data])
    decrypted_message = decrypted_data.decode('utf-8')
    print(f'接收到的消息: {decrypted_message}')

    # 把解密后的消息保存到文件
    with open('received.txt', 'a', encoding='utf-8') as f:
        f.write(decrypted_message + '\n')

    # 给客户端发送消息
    msg = input('请输入要发送给客户端的消息: ')
    # 将字符串转为字节,再进行异或加密
    msg_bytes = msg.encode('utf-8')
    encrypted_msg = bytes([byte ^ key for byte in msg_bytes])
    conn.send(encrypted_msg)

conn.close()
server.close()

2.运行结果截图
发送方

接收方

(四)程序代码托管到码云

链接:https://gitee.com/huangxun913/pythonandfanwan/commit/07eeaa521ab71e952fd4ad6fe919115306bd9ea6
https://gitee.com/huangxun913/pythonandfanwan/commit/6088088ca90fe87e3ae5f72c58f543e9c469d1da

三、 实验过程中遇到的问题和解决过程

  • 问题1:调试过程中代码报错
  • 问题1解决方案:查询ai后发现open()函数打开文件却没有指定编码时,Python会采用默认编码gbk,而文件内容包含gbk 编码无法识别的字符,最后通过明确指定utf-8 编码解决

四、其他(感悟、思考等)
很多语句不是那么懂,这时候得多问老师同学,或者借助ai等帮助学习python。

参考资料

posted @ 2025-04-22 15:27  HX1015  阅读(14)  评论(0)    收藏  举报