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

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

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

(一)实验内容和要求

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

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

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

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

(4)程序代码托管到码云。

(二)实验过程和结果
先搞了一个客户端代码client.py

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.31.86', 1234) 
client_socket.connect(server_address)

while True:
    message = input('客户端输入: ')
    client_socket.send(message.encode('utf-8'))
    
    data = client_socket.recv(1024).decode('utf-8')
    print('服务端回复:', data)
    
    if message.lower() == 'exit':
        break

client_socket.close()

然后搞了一个服务器端代码server.py

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.31.86', 1234)
server_socket.bind(server_address)
server_socket.listen(1)

client_socket, client_address = server_socket.accept()

while True:
    data = client_socket.recv(1024).decode('utf-8')
    print('客户端消息:', data)
    
    response = input('服务端输入: ')
    client_socket.send(response.encode('utf-8'))
    
    if data.lower() == 'exit':
        break

client_socket.close()
server_socket.close()

然后试图运行。。。。。


我无语了,不太清楚哪里错了,然后重启了一下程序。。。
重新来。。。。
先运行 server.py 脚本,服务器开始监听。。。。。
再运行 client.py 脚本,客户端连接到服务器,开始进行交互。。。。。

然后报错了呜呜呜。。。。我太难了。。。。

然后参考网上的东西又重新写了代码。。。。。改了之后在客户端连接失败和服务器监听的一些地方添加了提示信息。。。。
然后还加了客户端代码的 try...finally 结构。。。。据说可以避免资源泄漏。。。
这个是新的client.py

import socket

try:
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('localhost', 1234)
    client_socket.connect(server_address)

    while True:
        message = input('客户端输入: ')
        client_socket.send(message.encode('utf-8'))

        data = client_socket.recv(1024).decode('utf-8')
        print('服务端回复:', data)

        if message.lower() == 'exit':
            break

except ConnectionRefusedError:
    print("无法连接到服务器,请检查服务器是否正在运行。")
except Exception as e:
    print(f"发生错误: {e}")
finally:
    client_socket.close()

这个是新的server.py

import socket

try:
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('localhost', 1234)
    server_socket.bind(server_address)
    server_socket.listen(1)

    print("服务器正在监听...")
    client_socket, client_address = server_socket.accept()
    print(f"已连接到客户端: {client_address}")

    while True:
        data = client_socket.recv(1024).decode('utf-8')
        print('客户端消息:', data)

        response = input('服务端输入: ')
        client_socket.send(response.encode('utf-8'))

        if data.lower() == 'exit':
            break

except Exception as e:
    print(f"发生错误: {e}")
finally:
    if 'client_socket' in locals():
        client_socket.close()
    server_socket.close()
    

貌似可以用,然后输了一个hi之后可以在另一边看到:

在这边输入的东西也可以在另一边看到!

反正终于能跑了呜呜呜。。。。。。。。。

下面是实验2!

在传信息的基础上加入了加密解密的功能以及打开文件和关闭文件的功能
以下是代码。
client.py

import socket


def encrypt(text, shift=3):
    result = ""
    for char in text:
        if char.isalpha():
            base = ord('a') if char.islower() else ord('A')
            result += chr((ord(char) - base + shift) % 26 + base)
        else:
            result += char
    return result


try:
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('localhost', 1234)
    client_socket.connect(server_address)

    while True:
        message = input('客户端输入: ')
        if message.lower().startswith("file:read"):
            client_socket.send(message.encode('utf-8'))
        elif message.lower() == 'sendfile':
            try:
                with open('secret.txt', 'r') as f:
                    encrypted = encrypt(f.read())
                    client_socket.send(encrypted.encode())
            except Exception as e:
                print("文件错误:", e)
        else:
            client_socket.send(message.encode('utf-8'))

        data = client_socket.recv(1024).decode('utf-8')
        print('服务端回复:', data)

        if message.lower() == 'exit':
            break

except ConnectionRefusedError:
    print("无法连接到服务器,请检查服务器是否正在运行。")
except Exception as e:
    print(f"发生错误: {e}")
finally:
    client_socket.close()
    

server.py

import socket


def decrypt(text, shift=3):
    def encrypt(text, shift):
        result = ""
        for char in text:
            if char.isalpha():
                base = ord('a') if char.islower() else ord('A')
                result += chr((ord(char) - base + shift) % 26 + base)
            else:
                result += char
        return result

    return encrypt(text, -shift)


try:
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = ('localhost', 1234)
    server_socket.bind(server_address)
    server_socket.listen(1)

    print("服务器正在监听...")
    client_socket, client_address = server_socket.accept()
    print(f"已连接到客户端: {client_address}")

    while True:
        data = client_socket.recv(1024).decode('utf-8')
        print('客户端消息:', data)

        if data.lower().startswith("file:"):
            command = data.split(":")[1].strip()
            if command.startswith("read"):
                try:
                    with open(command.split()[1], 'r') as f:
                        file_content = f.read()
                        client_socket.send(file_content.encode('utf-8'))
                except Exception as e:
                    error_msg = f"文件错误: {e}"
                    client_socket.send(error_msg.encode('utf-8'))
        elif data.lower() == 'sendfile':
            data = client_socket.recv(4096).decode()
            decrypted = decrypt(data)
            with open('received.txt', 'w') as f:
                f.write(decrypted)
            response = "文件已接收并解密保存"
            client_socket.send(response.encode('utf-8'))
        else:
            response = input('服务端输入: ')
            client_socket.send(response.encode('utf-8'))

        if data.lower() == 'exit':
            break

except Exception as e:
    print(f"发生错误: {e}")
finally:
    if 'client_socket' in locals():
        client_socket.close()
    server_socket.close()

然后先try了try刚刚的功能还能不能用:


然后发现可以用
然后第二步测试是我先在客户端输入sendfile,客户端会读取secret.txt文件里面的内容,对其解密后发送给服务器端,然后服务器端应该就可以看到解密之后的东西哦
secret.txt中的内容是hhh
然后服务器的代码中调用了decrypt函数用来对加密文本进行解密,它里面又调用了encrypt函数实现反向加密,大概是这样。

!!!发现获得了解密之后的内容!

3.上传到码云

4.实验问题和感悟

我太难了,最开始是联网的时候有问题。。。。问了好多同学,后面又发现代码有问题。。。整了半天才让代码没有报错。。没有报错之后不知道为什么被电脑积极拒绝了。。。。然后又换了一种写法才做出来。。。。做出来之后又不会运行。。。然后又去问别人。。。。然后又花了一堆时间在让这两个端能传文件上。。。。。。我太难了。。。。。

参考资料
《零基础学Python》(2018 明日科技编著)

《Python从入门到实战》

...

posted @ 2025-04-21 22:49  。。。shshhshs  阅读(23)  评论(0)    收藏  举报