20241202王凯 实验三《Python程序设计》实验报告

------------恢复内容开始------------
课程:《Python程序设计》
班级: 2412
姓名: 王凯
学号:20241202
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课

1.实验内容

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

2. 实验过程及结果

(1)进行socket的引入学习;

(2)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序(代码在下一部分);
下图为作为客户端和服务端的运行结果。(客户端与服务端地址都需输入服务端的,否则无法连接);

3.服务端代码


# 简单的解密函数(Caesar 密码)
def decrypt(text, shift):
    return encrypt(text, -shift)

# 简单的加密函数(Caesar 密码)
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 = ('192.168.30.2', 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.客户端代码

'''使用凯撒密码加密'''
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()

使用此客户端代码时,能进行解密,但无法进行通讯,如下图(服务器一端运行结果);

使用ai进行了一些修改,代码如下;

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.30.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. 提交至gitee,如下图

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

  • 问题1:我作为服务端时,两人通讯时聊一次就退出了,如下图;

  • 问题1解决方案:对方将客户端代码进行了一些改正,如下图(包含客户端改正后的代码及运行结果);

  • 问题2:我作为客户端时,无法接入对方服务器,如下图

    问题2解决方案:地址不能输入自己电脑上的,应输入对方(服务端)的地址;

其他(感悟、思考等)

又又又学到了东西,虽然有些懵懂,但总的来说,是一次新奇的模式,链接对话初步给我一种高级感以及更大的兴趣。
老师的教导,自己动手与同学间的交流学习缺一不可;要学的还有很多,未来道路任重而道远。

posted @ 2025-04-23 20:44  若梦若孟  阅读(25)  评论(0)    收藏  举报