“20242113 实验三《Python程序设计》实验报告”
20242113 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2421
姓名: 陈铂翔
学号:20242113
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
I.创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
II.实验要求
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
2. 实验过程及结果
I.环境准备

II.创建客户端
import socket
from cryptography.fernet import Fernet
# 必须与服务端使用相同密钥
key = b'pRmgMa8T0INjEAfksaq2aafzoZXEuwKIvDCD8gZW8ek='
cipher = Fernet(key)
def send_file(host):
port = 12345
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
# 读取并发送文件
try:
with open('client_input.txt', 'rb') as f:
file_data = f.read()
encrypted_data = cipher.encrypt(file_data)
s.send(len(encrypted_data).to_bytes(4, byteorder='big'))
s.sendall(encrypted_data)
print(f"已发送 {len(file_data)} 字节原始数据")
# 接收回复
resp_len = int.from_bytes(s.recv(4), byteorder='big')
encrypted_resp = s.recv(resp_len)
decrypted_resp = cipher.decrypt(encrypted_resp)
with open('client_response.txt', 'wb') as f:
f.write(decrypted_resp)
print(f"已接收 {len(decrypted_resp)} 字节回复数据")
except FileNotFoundError:
print("错误:未找到输入文件")
if __name__ == '__main__':
server_ip = input("请输入服务端IP地址: ")
send_file(server_ip)
III.创建服务端
import socket
from cryptography.fernet import Fernet
# 使用预共享密钥进行加密解密
key = b'pRmgMa8T0INjEAfksaq2aafzoZXEuwKIvDCD8gZW8ek='
cipher = Fernet(key)
def handle_client(conn):
# 接收数据长度信息
data_len = int.from_bytes(conn.recv(4), byteorder='big')
encrypted_data = conn.recv(data_len)
# 解密数据
try:
decrypted_data = cipher.decrypt(encrypted_data)
except:
decrypted_data = b"Decryption Error"
# 写入接收文件
with open('server_received.txt', 'wb') as f:
f.write(decrypted_data)
print(f"已接收并保存 {len(decrypted_data)} 字节数据")
# 读取回复文件并发送
try:
with open('server_response.txt', 'rb') as f:
response_data = f.read()
encrypted_resp = cipher.encrypt(response_data)
conn.send(len(encrypted_resp).to_bytes(4, byteorder='big'))
conn.sendall(encrypted_resp)
except FileNotFoundError:
print("警告:未找到回复文件")
def main():
host = '0.0.0.0'
port = 12345
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen()
print("服务端已启动,等待连接...")
while True:
conn, addr = s.accept()
with conn:
print(f"连接来自: {addr}")
handle_client(conn)
if __name__ == '__main__':
main()
首先,运行服务器端代码。它将绑定到指定的地址和端口,并开始监听连接请求。
当你看到输出
时,表示服务器已经开始监听连接请求了。
当你看到输出连接来自 127.0.0.1:52937 时,表示客户端已经成功连接到服务器。
IV.进行对话测试
客户端输入 文件


服务端保存 文件


V.局域网实现
(注:和韩子杰同学在同一WiFi下实现链接,服务器IP为192.168.10.145,端口选择:1390)

VI.代码提交码云

3. 实验过程中遇到的问题和解决过程
- 问题1:程序无法运行报错
- 问题1解决方案:询问AI得知有包未安装,进行安装
![]()
- 问题2:初次调试程序返回报错
![]()
- 问题2解决方案:检查条件知道原因为未创建返回文件,故创建返回文件
![]()
其他(感悟、思考等)
这个实验提供了一个简单的交互体验,可以在客户端输入消息并得到服务器端的响应。这种交互方式类似于实际应用中的聊天系统或实时通信应用,可以作为学习网络编程的起点。是学习网络编程的一个很好的起点,通过它可以初步了解网络通信的基本原理和实现方式,为进一步探索网络编程打下基础。



浙公网安备 33010602011771号