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不统一情况,为我自行测试和与同学交互或使用不同网络导致

浙公网安备 33010602011771号