20231213 实验三《Python程序设计》实验报告
20231213 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2312
姓名: 蔡明辉
学号:20231213
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
(一)实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(二)实验要求
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
2. 实验过程及结果
设计完成基本的交互操作
服务端
import socket
def client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.23.12.13'
port = 12345
client_socket.connect((host, port))
print("连接到服务器")
while True:
message = input("发送消息:")
client_socket.send(message.encode('utf-8'))
if message == 'exit':
print('服务端终止通信')
break
response = client_socket.recv(1024).decode('utf-8')
print(f"收到服务器消息:{response}")
if response == 'exit':
break
client_socket.close()
client()
客户端
import socket
def server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.23.12.13'
port = 12345
server_socket.bind((host, port))
server_socket.listen(5)
print(f"服务器正在监听 {host}:{port}")
client_socket, addr = server_socket.accept()
print(f"收到连接来自:{addr}")
#通信
while True:
message = client_socket.recv(1024).decode('utf-8')
if message == 'exit':
print("客户端请求退出")
break
print(f"收到客户端消息:{message}")
response = input("服务端回复:")
client_socket.send(response.encode('utf-8'))
if response == 'exit':
break
client_socket.close()
server_socket.close()
server()
增添文件的传输和接收存储功能
#
with open('message_to_send.txt', 'r') as file:
message = file.read()
message = message.encode('utf-8')
client_socket.send(message)
#
message = client_socket.recv(1024)
message = message.decode('utf-8')
with open('message.txt', 'w') as file:
file.write(message)
print("消息已保存到文件")
增添加密和解密功能,此处使用简单实现的凯撒密码加密
def encrypt_message(message, shift = 3):
charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+[]{}|;:',.<>?/"
encrypted = ''
for char in message:
if char in charset:
idx = charset.index(char)
new_idx = (idx + shift) % len(charset)
encrypted += charset[new_idx]
else:
encrypted += char
return encrypted
def decrypt_message(encryptedmessage, shift = 3):
return encrypt_message(encryptedmessage, -shift)
#客户端
with open('message_to_send.txt', 'r') as file:
message = file.read()
encrypted_message = encrypt_message(message).encode('utf-8')
client_socket.send(encrypted_message)
print("加密消息已发送")
#服务端
#密文
encrypted_message = client_socket.recv(1024)
message = encrypted_message.decode('utf-8')
with open('message.txt', 'w') as file:
file.write(message)
print("加密后消息已保存到文件")
#解密
decrypted_message = decrypt_message(encrypted_message.decode('utf-8'))
with open('received_message.txt', 'w') as file:
file.write(decrypted_message)
print("消息已解密并保存到文件")
运行结果
客户端与服务端:


客户端收到服务端消息后存储,实现密文的接收和解密:

代码:
https://gitee.com/cloud-lumiere/2025-python-course/blob/master/实验三服务端.py
https://gitee.com/cloud-lumiere/2025-python-course/blob/master/实验三客户端.py
3. 实验过程中遇到的问题和解决过程
- 问题1:在初步测试时出现
OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 - 问题1解决方案:原因是测试后未及时结束程序运行,测试时用新终端运行程序,导致地址被占用。
- 问题2:使用老师提供的加密函数时,出现
ImportError: cannot import name 'decrypt_message' from 'crypto - 问题2解决方案:根据已经掌握的密码学知识,自行设计了简单的凯撒密码加密,完成了加密和解密的实验内容
其他
本次实验恰与正在学习的信息安全和计算机网络相关,通过wireshark抓包明文和密文分析,加深了对信息安全的认识
通过学习socket编程,加深了对TCP/IP网络的理解

浙公网安备 33010602011771号