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

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

1.实验内容

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

2. 实验过程及结果

(1)初步建立连接的代码

服务端代码

import os
# coding: utf-8
# Project:PyCharmMiscProject
# File:实验三.Socket编程.py
# Author:liuchuanzhi
# Date :2025/4/16 18:33
# IDE:PyCharm
import socket

# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址和端口
server_address = ('192.168.197.42', 9999)
server_socket.bind(server_address)

# 监听连接
server_socket.listen(1)
print('服务器正在监听 {}:{}'.format(*server_address))

# 接受客户端连接
client_socket, client_address = server_socket.accept()
print('接受来自 {} 的连接'.format(client_address))

while True:
    # 接收客户端消息
    data = client_socket.recv(1024).decode('utf-8')
    if not data:
        break
    print('客户端说: {}'.format(data))

    # 发送消息给客户端
    message = input('请输入要发送给客户端的消息: ')
    client_socket.send(message.encode('utf-8'))
    if input("是否要继续?Y/N")=="N" or "n":
        break

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

客户端代码

# coding: utf-8
# Project:PyCharmMiscProject
# File:实验三.Socket编程.py
# Author:liuchuanzhi
# Date :2025/4/16 18:33
# IDE:PyCharm
import socket
#新建Socket,实例化
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#连接服务器
client_socket.connect(('192.168.210.162', 9999))
# client_socket.connect(('localhost', 9999))
while True:
    client_socket.send(input("客户端说:").encode("utf-8"))
    data = client_socket.recv(1024)
    print("服务端回答:",data.decode("utf-8"))
    if input("是否要继续?Y/N") == "N" or "n":
        break
client_socket.close()

(2)加入加密算法后的代码

(来自Mr.Wang的加密解密函数)

def encrypt_message(message):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(pad(message.encode('utf-8'), AES.block_size))
    return iv + encrypted

def decrypt_message(encrypted_message):
    iv = encrypted_message[:AES.block_size]
    encrypted = encrypted_message[AES.block_size:]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
    return decrypted.decode('utf-8')

服务端源代码

# coding: utf-8
# Project:PyCharmMiscProject
# File:实验三.Socket编程.py
# Author:liuchuanzhi
# Date :2025/4/16 18:33
# IDE:PyCharm
import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os

# 加密密钥和初始化向量
key = os.urandom(16)
iv = os.urandom(16)


def encrypt_message(message):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(pad(message.encode('utf-8'), AES.block_size))
    return iv + encrypted


def decrypt_message(encrypted_message):
    iv = encrypted_message[:AES.block_size]
    encrypted = encrypted_message[AES.block_size:]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
    return decrypted.decode('utf-8')


# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定地址和端口
server_address = ('192.168.73.42',8888)
server_socket.bind(server_address)

# 监听连接
server_socket.listen(1)
print('服务器正在监听 {}:{}'.format(*server_address))

# 接受客户端连接
client_socket, client_address = server_socket.accept()
print('接受来自 {} 的连接'.format(client_address))

try:
    # 先发送密钥和IV给客户端
    client_socket.send(key + iv)

    conversation = []
    while True:
        # 接收客户端加密消息
        encrypted_data = client_socket.recv(1024)
        if not encrypted_data:
            break
        # 解密消息
        decrypted_message = decrypt_message(encrypted_data)
        conversation.append(f"客户端: {decrypted_message}")
        print('客户端加密消息解密后: {}'.format(decrypted_message))

        # 发送消息给客户端
        plaintext_message = input('请输入要发送给客户端的消息: ')
        encrypted_message = encrypt_message(plaintext_message)
        client_socket.send(encrypted_message)
        conversation.append(f"服务端: {plaintext_message}")

        if input("是否要继续对话?Y/N").upper() == "N":
            break

    # 后续操作可以继续添加,这里仅打印对话记录
    print("对话记录:")
    for line in conversation:
        print(line)

except Exception as e:
    print(f'发生错误: {e}')
finally:
    # 关闭连接
    client_socket.close()
    server_socket.close()


客户端源代码

# coding: utf-8
# Project:PyCharmMiscProject
# File:实验三.Socket编程.py
# Author:liuchuanzhi
# Date :2025/4/16 18:33
# IDE:PyCharm
import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os

# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 连接到服务器
server_address = ('192.168.73.42',8888)
client_socket.connect(server_address)

# 接收服务器发送的密钥和IV
key_iv = client_socket.recv(32)
key = key_iv[:16]
iv = key_iv[16:]


def encrypt_message(message):
    cipher = AES.new(key, AES.MODE_CBC, iv)
    encrypted = cipher.encrypt(pad(message.encode('utf-8'), AES.block_size))
    return iv + encrypted


def decrypt_message(encrypted_message):
    iv = encrypted_message[:AES.block_size]
    encrypted = encrypted_message[AES.block_size:]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = unpad(cipher.decrypt(encrypted), AES.block_size)
    return decrypted.decode('utf-8')


try:
    conversation = []
    while True:
        # 发送消息给服务器
        plaintext_message = input('请输入要发送给服务器的消息: ')
        encrypted_message = encrypt_message(plaintext_message)
        client_socket.send(encrypted_message)
        conversation.append(f"客户端: {plaintext_message}")

        # 接收服务器加密消息
        encrypted_data = client_socket.recv(1024)
        if not encrypted_data:
            break
        # 解密消息
        decrypted_message = decrypt_message(encrypted_data)
        conversation.append(f"服务端: {decrypted_message}")
        print('服务器加密消息解密后: {}'.format(decrypted_message))

        if input("是否继续对话?Y/N").upper() == "N":
            break

    # 将对话保存为加密文件
    conversation_text = '\n'.join(conversation)
    encrypted_conversation = encrypt_message(conversation_text)
    with open('encrypted_conversation.bin', 'wb') as file:
        file.write(encrypted_conversation)
    print("对话已保存为加密文件 encrypted_conversation.bin")
    #好奇加密成什么样子了,下面截图有展示
    # 后续操作可以继续添加,这里仅打印对话记录
    print("对话记录:")
    for line in conversation:
        print(line)

except Exception as e:
    print(f'发生错误: {e}')
finally:
    # 关闭连接
    client_socket.close()

(确实加密成了我看不懂的样子)

(3)加入加密算法的运行结果

服务端:

客户端:

(4)上传至gitee

https://gitee.com/liuchuanzhi123/PyCharmMiscProject

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

  • 问题1:出现计算机积极拒绝的情况。
  • 问题1解决方案:经检查发现两设备所联网未统一,连接同一wifi后解决。
  • 问题2:接收端输出乱码看不懂。
  • 问题2解决方案:发现误用gbk,统一为utf-8后正常输出。
  • ...

其他(感悟、思考等)

本次实验初步接触了socket网络编程,实现了简单的服务端/客户端的建立并完成交互通信,为我打开了探索Python编程的又一扇大门。
“人生苦短,我用Python”
注:可能有ip不统一情况,为我自行测试和与同学交互或使用不同网络导致

posted @ 2025-04-20 18:35  lcz莱茵河畔  阅读(35)  评论(0)    收藏  举报