2024-2025-2 《Python程序设计》实验三报告
学号 20241311 2024-2025-2《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2413
姓名: 廖江泽
学号:20241311
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
- 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
2. 实验过程及结果
- 获取无线局域网适配器WLAN中的IPv4地址:
- 关闭电脑防火墙:
-进行通讯:
客户端代码
import socket
# 创建 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
server_address = ('192.168.83.9', 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))
# if (input("是否继续Y/N?")=="N"):
# break
# 关闭连接
client_socket.close()
服务端代码:
import socket
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_address = ('192.168.83.9', 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":
break
# 关闭连接
client_socket.close()
server_socket.close()
-
运行结果如下:
-
采用AES加密:
客户端:
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import os
import socket
# 密钥和初始化向量,需和服务端保持一致
key = b'Sixteen byte key'
iv = b'InitializationVe'
def aes_encrypt(data):
try:
cipher = AES.new(key, AES.MODE_CBC, iv)
padded_data = pad(data.encode('utf-8'), AES.block_size)
encrypted_data = cipher.encrypt(padded_data)
return encrypted_data
except Exception as e:
print(f"加密过程出错: {e}")
return None
server_address = ('192.168.83.9', 8888)
file_name = 'send_file.txt'
log_file = 'client_log.txt'
client_socket = None
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(server_address)
use_existing_file = input("是否使用已有的文件?(Y/N): ").strip().upper()
script_dir = os.path.dirname(os.path.abspath(__file__))
if use_existing_file == 'Y':
file_path = os.path.join(script_dir, file_name)
if not os.path.exists(file_path):
print(f"文件 {file_name} 不存在,将创建新文件并提示输入内容。")
use_existing_file = 'N'
if use_existing_file == 'N':
file_path = os.path.join(script_dir, file_name)
print("\n请输入要发送的内容(输入空行结束):")
content = []
while True:
line = input()
if not line:
break
content.append(line)
content = '\n'.join(content)
with open(file_path, 'w', encoding='utf-8') as file:
file.write(content)
print(f"内容已保存到 {file_name}")
with open(file_path, 'r', encoding='utf-8') as file:
plaintext_data = file.read()
encrypted_data = aes_encrypt(plaintext_data)
if encrypted_data is None:
raise ValueError("加密失败,无法继续执行。")
with open(log_file, 'w', encoding='utf-8') as log:
log.write("加密前的内容:\n")
log.write(plaintext_data)
log.write("\n\n加密后的内容:\n")
log.write(encrypted_data.hex())
confirm = input("\n是否发送文件内容?(Y/N): ").strip().upper()
if confirm == 'Y':
client_socket.send(encrypted_data)
print('数据已加密并发送')
else:
print("发送已取消。")
except ConnectionRefusedError:
print("无法连接到服务器,请检查服务端是否启动。")
except FileNotFoundError:
print("文件未找到,请检查文件路径。")
except Exception as e:
print(f"发生未知错误: {e}")
finally:
if client_socket:
client_socket.close()
服务端:
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import socket
import os
# 密钥和初始化向量,需和客户端保持一致
key = b'Sixteen byte key'
iv = b'InitializationVe'
def aes_decrypt(encrypted_data):
try:
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted_data = cipher.decrypt(encrypted_data)
unpadded_data = unpad(decrypted_data, AES.block_size)
return unpadded_data.decode('utf-8')
except Exception as e:
print(f"解密过程出错: {e}")
return None
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.83', 8888)
log_file = 'server_log.txt'
client_socket = None
try:
server_socket.bind(server_address)
server_socket.listen(1)
print(f'服务器正在监听 {server_address[0]}:{server_address[1]}')
client_socket, client_address = server_socket.accept()
print(f'接受来自 {client_address} 的连接')
encrypted_data = client_socket.recv(4096)
decrypted_data = aes_decrypt(encrypted_data)
if decrypted_data is None:
raise ValueError("解密失败,无法继续执行。")
with open(log_file, 'w', encoding='utf-8') as log:
log.write("接收到的加密内容:\n")
log.write(encrypted_data.hex())
log.write("\n\n解密后的内容:\n")
log.write(decrypted_data)
script_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(script_dir, 'received_file.txt')
with open(file_path, 'w', encoding='utf-8') as file:
file.write(decrypted_data)
print('数据已解密并保存到 received_file.txt')
except OSError as e:
print(f"服务器绑定或监听时出现错误: {e}")
except FileNotFoundError:
print("文件未找到,请检查文件路径。")
except Exception as e:
print(f"发生未知错误: {e}")
finally:
if client_socket:
client_socket.close()
if server_socket:
server_socket.close()
-
运行结果如下:
-
上传至码云:
3. 实验过程中遇到的问题和解决过程
- 问题1:在进行不同计算机之间的通信时,显示“目标计算机积极防御”。
- 问题1解决方案:询问同学,知道了是防火墙的问题关闭防火墙