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

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

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

一.实验内容

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

二. 实验过程及结果

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

(1)作为客户端

import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''连接服务器'''
client_socket.connect(("192.168.30.2", 9999))
while True:
    client_socket.send(input("zk说:").encode())
    data = client_socket.recv(1024)
    print("wk回答:",data.decode())
    if client_socket.send(input("退出请输入q"))=='q':
        break
client_socket.close()

直接使用代码发现只能运行一轮,觉得是退出逻辑有问题

发现“client_socket.send()”方法返回的是成功发送的字节数量,并非发送的内容,因此不能用它来判断是否输入了q

以此进行修改

import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''连接服务器'''
client_socket.connect(("192.168.30.2", 9999))
while True:
    message = input("zk说:")
    client_socket.send(message.encode())
    if message.lower() == 'q':
        break
    data = client_socket.recv(1024)
    print("wk回答:", data.decode())
client_socket.close()

成功运行

(2)作为服务端

import socket
'''新建服务端socket'''
server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address=('192.168.30.2',9999)
'''绑定'''
server_socket.bind(address)
'''监听'''
server_socket.listen(5)
'''接受'''
client_socket, address = server_socket.accept()
print("我们收到了{}的链接".format(address))
while True:
    data=client_socket.recv(1024)
    if not data:
        break
    print("slave wk说:{}".format(data.decode()))
    client_socket.send(input("master zk回应:").encode())
'''关闭连接'''
client_socket.close()

显示地址无效

对方显示

发现是IDv4的地址出现问题,双方应当输入服务端的地址,因为服务端需要绑定并监听

修改后成功运行

2.要求包含文件的基本操作,例如打开和读写操作

3.要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。

客户端代码

使用凯撒密码加密,将文本通过后移(shift == 3)位,将input.txt发送给服务端

import socket
'''使用凯撒密码加密'''
def encrypt(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
            start = ord('A') if char.isupper() else ord('a')
            result += chr((ord(char) - start + shift) % 26 + start)
        else:
            result += char
    return result

'''读取文件内容'''
try:
    with open('input.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print("文件未找到,请确保 input.txt 文件存在。")
    exit()

'''加密内容'''
shift = 3
encrypted_content = encrypt(content, shift)

'''创建客户端 socket'''
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''连接服务器'''
server_address = ('192.168.30.2', 9999)
client_socket.connect(server_address)

'''发送加密内容'''
client_socket.send(encrypted_content.encode())

'''关闭连接'''
client_socket.close()

input.txt内容

服务端代码

import socket

'''解码凯撒密码'''
def decrypt(text, shift):
    return encrypt(text, -shift)

'''凯撒密码加密'''
def encrypt(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
            start = ord('A') if char.isupper() else ord('a')
            result += chr((ord(char) - start + shift) % 26 + start)
        else:
            result += char
    return result

'''创建服务器 socket'''
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''绑定地址和端口'''
server_address = ('127.0.0.1', 9999)
server_socket.bind(server_address)
'''监听'''
server_socket.listen(1)

print("等待客户端连接...")
client_socket, client_address = server_socket.accept()
print(f"客户端 {client_address} 已连接。")

'''接收加密内容'''
encrypted_content = client_socket.recv(4096).decode()

'''解密内容'''
shift = 3
decrypted_content = decrypt(encrypted_content, shift)

'''将解密后的内容保存到文件'''
try:
    with open('output.txt', 'w') as file:
        file.write(decrypted_content)
    print("解密后的内容已保存到 output.txt。")
except Exception as e:
    print(f"保存文件时出错: {e}")

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

服务端结果

4.把通信和文件传输结合一下

客户端代码

import socket
'''凯撒密码加密'''
def encrypt(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
            start = ord('A') if char.isupper() else ord('a')
            result += chr((ord(char) - start + shift) % 26 + start)
        else:
            result += char
    return result
'''凯撒密码解密'''
def decrypt(text, shift):
    return encrypt(text, -shift)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''连接服务器'''
client_socket.connect(("192.168.190.2", 9999))

shift = 3
while True:
    choice = input("输入 1 从文件读取内容发送,输入 2 手动输入内容发送,输入 q 退出:")
    if choice == 'q':
        break
    elif choice == '1':
        try:
            with open('input.txt', 'r') as file:
                content = file.read()
            encrypted_content = encrypt(content, shift)
            client_socket.send(encrypted_content.encode())
        except FileNotFoundError:
            print("文件未找到,请确保 input.txt 文件存在。")
    elif choice == '2':
        message = input("zk 说:")
        encrypted_message = encrypt(message, shift)
        client_socket.send(encrypted_message.encode())

    encrypted_data = client_socket.recv(1024).decode()
    decrypted_data = decrypt(encrypted_data, shift)
    print("wk 回答:", decrypted_data)

client_socket.close()

服务端代码

import socket


'''凯撒密码加密'''
def encrypt(text, shift):
    result = ""
    for char in text:
        if char.isalpha():
            start = ord('A') if char.isupper() else ord('a')
            result += chr((ord(char) - start + shift) % 26 + start)
        else:
            result += char
    return result


'''凯撒密码解密'''
def decrypt(text, shift):
    return encrypt(text, -shift)


''' 新建服务端 socket'''
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.190.2', 9999)
'''绑定'''
server_socket.bind(address)
'''监听'''
server_socket.listen(5)
'''接受'''
client_socket, address = server_socket.accept()
print("我们收到了{}的链接".format(address))

shift = 3
while True:
    encrypted_data = client_socket.recv(1024).decode()
    if not encrypted_data:
        break
    decrypted_data = decrypt(encrypted_data, shift)
    print("slave wk 说:{}".format(decrypted_data))

    try:
        with open('output.txt', 'a') as file:
            file.write(decrypted_data + '\n')
        print("收到的内容已保存到 output.txt。")
    except Exception as e:
        print(f"保存文件时出错: {e}")

    message = input("master zk 回应:")
    encrypted_message = encrypt(message, shift)
    client_socket.send(encrypted_message.encode())

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

客户端运行

服务端运行

5.程序代码托管到码云

https://gitee.com/masterzk01/py-homework/blob/master/实验3.1.py
https://gitee.com/masterzk01/py-homework/blob/master/实验3.2.py

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

  • 问题1:不知道怎么上传文件
  • 问题1解决方案:将文件放在py程序所在目录进行上传
  • 问题2:在完成最后一项时发送和接收出现乱码
  • 问题2解决方案:因为使用了凯撒加密,应当使用英文传输

四. 其他(感悟、思考等)

在实验时因为文件操作使用不是很熟练,遇到了很多阻碍,但是通过查阅资料还是成功攻克,还是很有成就感的

五. 参考资料

posted @ 2025-04-23 19:35  masterzk01  阅读(30)  评论(0)    收藏  举报