20243402谢子凌 实验三《Python程序设计》实验报告
20243402 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2434
姓名: 谢子凌
学号:20243402
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(3)发送方加密后并传输;接收方收到密文并解密。
(4)程序代码托管到码云。
2. 实验过程及结果
(1)首先编写实现简单本地通信
1.代码:
客户端

import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 9999)
client_socket.connect(server_address)
while True:
message = input('请输入要发送给服务器的消息: ')
client_socket.send(message.encode('utf-8'))
data = client_socket.recv(1024).decode('utf-8')
if not data:
break
print('服务器说: {}'.format(data))
client_socket.close()
服务端:

import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('localhost', 9999)
server_socket.bind(address)
server_socket.listen()
print('服务器正在监听 {}'.format(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":
break
client_socket.close()
server_socket.close()
2.运行结果:


(2)根据老师发的代码实现加密效果(由于没学过密码学,借助deepseek进行调试):
1.代码
客户端:

import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os
key = os.urandom(32)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 9999))
print("已连接到服务器")
client_socket.send(key)
print("已发送密钥到服务器")
def encrypt_message(message):
iv = os.urandom(AES.block_size) # 随机生成 IV
cipher = AES.new(key, AES.MODE_CBC, iv)
encrypted = cipher.encrypt(pad(message.encode('utf-8'), AES.block_size))
return iv + encrypted # 返回 IV + 密文
def decrypt_message(encrypted_data):
iv = encrypted_data[:AES.block_size] # 提取 IV
ciphertext = encrypted_data[AES.block_size:] # 提取密文
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)
return decrypted.decode('utf-8')
try:
while True:
message = input("输入要发送的消息: ")
encrypted_msg = encrypt_message(message)
client_socket.send(encrypted_msg)
encrypted_reply = client_socket.recv(1024)
if not encrypted_reply:
break
decrypted_reply = decrypt_message(encrypted_reply)
print(f"服务器回复: {decrypted_reply}")
except Exception as e:
print(f"发生错误: {e}")
finally:
client_socket.close()
print("客户端已关闭")
服务端

import socket
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import os
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('127.0.0.1', 9999)
server_socket.bind(address)
server_socket.listen()
print('服务器正在监听 {}'.format(address))
client_socket, addr = server_socket.accept()
接收客户端发送的 AES 密钥
key = client_socket.recv(32)
print("已接收客户端密钥")
def encrypt_message(message):
iv = os.urandom(AES.block_size) # 随机生成 IV
cipher = AES.new(key, AES.MODE_CBC, iv)
encrypted = cipher.encrypt(pad(message.encode('utf-8'), AES.block_size))
return iv + encrypted # 返回 IV + 密文
def decrypt_message(encrypted_data):
iv = encrypted_data[:AES.block_size] # 提取 IV
ciphertext = encrypted_data[AES.block_size:] # 提取密文
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = unpad(cipher.decrypt(ciphertext), AES.block_size)
return decrypted.decode('utf-8')
try:
while True:
# 接收客户端消息并解密
encrypted_data = client_socket.recv(1024)
if not encrypted_data:
break
decrypted_msg = decrypt_message(encrypted_data)
print(f"客户端说: {decrypted_msg}")
# 发送加密回复
reply = input("输入回复消息: ")
encrypted_reply = encrypt_message(reply)
client_socket.send(encrypted_reply)
except Exception as e:
print(f"发生错误: {e}")
finally:
client_socket.close()
server_socket.close()
print("服务器已关闭")
2.本地发送接受运行结果:


(3)与同学实现通讯:
作为服务端:

作为客户端:

(4)将代码托管到码云

3. 实验过程中遇到的问题和解决过程
- 问题1:感觉俩人连一个热点还是太吃操作了,有没有不用连一个网的方法推荐一下?有的兄弟,有的。
- 问题1解决方案:使用内网穿透技术
用樱花frp网站实现
![]()
![]()
![]()
运行结果:
![]()
![]()
其他(感悟、思考等)
感觉学到好东西了,老师教的太好啦!20243322汪子涵同学教我用内网穿透解决了连一个热点的问题,虽然说还不太理解原理,但是感觉用处蛮大的,收获颇丰!也是体会到了自己还有很多路要走,还有好多好多好多知识要学。






浙公网安备 33010602011771号