20241217 实验三《Python程序设计》实验报告
20241217 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2412
姓名: 黄迅
学号:20241217
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
一、实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
二、实验过程及结果
(一)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序
1.学习socket编程技术
2.代码如下
客户端代码
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('172.30.1.100', 9999))
while True:
message = input("客户端说:").strip()
client_socket.send(message.encode('utf-8'))
data = client_socket.recv(1024)
decoded_data = data.decode('utf-8')
print("服务端回答", decoded_data)
服务端代码
import socket
# 新建服务端socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('172.30.1.220', 8888)
server_socket.bind(address)
server_socket.listen(5)
client_socket, client_address = server_socket.accept()
print("我们收到{}的连接".format(client_address))
while True:
data = client_socket.recv(1024)
if not data:
break
decoded_data = data.decode('utf-8')
print("客户端说:{}".format(decoded_data))
response = input("服务端回应:")
client_socket.send(response.encode('utf-8'))
client_socket.close()
server_socket.close()
3.运行结果截图:
客户端
服务端
(二)要求包含文件的基本操作,例如打开和读写操作(选做)
(三)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中
1.完整代码
发送方
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('172.16.230.177', 8000))
# 定义异或加密使用的密钥,要和服务端一致
key = 0x55
while True:
try:
# 从文件读取内容
with open('message.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 将字符串转为字节,再进行异或加密
content_bytes = content.encode('utf-8')
encrypted_content = bytes([byte ^ key for byte in content_bytes])
client.send(encrypted_content)
# 接收服务端的消息并解密
encrypted_response = client.recv(1024)
decrypted_response = bytes([byte ^ key for byte in encrypted_response])
response_message = decrypted_response.decode('utf-8')
print(f'服务端消息: {response_message}')
choice = input('是否继续发送消息 (y/n): ')
if choice.lower() != 'y':
break
except FileNotFoundError:
print('未找到 message.txt 文件,请创建该文件并写入内容。')
break
except UnicodeDecodeError:
print('文件编码格式不兼容,请确保文件以 utf-8 编码保存。')
client.close()
接收方
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('172.16.220.184', 8000))
server.listen(1)
print('服务端正在监听端口8000...')
conn, addr = server.accept()
print(f'连接来自: {addr}')
# 定义异或加密使用的密钥
key = 0x55
while True:
# 接收客户端发送的密文
encrypted_data = conn.recv(1024)
if not encrypted_data:
break
# 进行异或解密
decrypted_data = bytes([byte ^ key for byte in encrypted_data])
decrypted_message = decrypted_data.decode('utf-8')
print(f'接收到的消息: {decrypted_message}')
# 把解密后的消息保存到文件
with open('received.txt', 'a', encoding='utf-8') as f:
f.write(decrypted_message + '\n')
# 给客户端发送消息
msg = input('请输入要发送给客户端的消息: ')
# 将字符串转为字节,再进行异或加密
msg_bytes = msg.encode('utf-8')
encrypted_msg = bytes([byte ^ key for byte in msg_bytes])
conn.send(encrypted_msg)
conn.close()
server.close()
2.运行结果截图
发送方
接收方
(四)程序代码托管到码云
链接:https://gitee.com/huangxun913/pythonandfanwan/commit/07eeaa521ab71e952fd4ad6fe919115306bd9ea6
https://gitee.com/huangxun913/pythonandfanwan/commit/6088088ca90fe87e3ae5f72c58f543e9c469d1da
三、 实验过程中遇到的问题和解决过程
- 问题1:调试过程中代码报错
- 问题1解决方案:查询ai后发现open()函数打开文件却没有指定编码时,Python会采用默认编码gbk,而文件内容包含gbk 编码无法识别的字符,最后通过明确指定utf-8 编码解决
四、其他(感悟、思考等)
很多语句不是那么懂,这时候得多问老师同学,或者借助ai等帮助学习python。
参考资料
- 《零基础学Python》
- https://blog.51cto.com/u_16175433/8078029