20241415 《Python程序设计》实验三实验报告
20241415 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2414
姓名: 赵邵宁
学号:20241415
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
一、实验内容
1.创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
2.要求包含文件的基本操作,例如打开和读写操作。
3.要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
4.程序代码托管到码云。
二、 实验过程及结果
1.在终端输入ifconfig(Mac系统)查询电脑的IP地址,用于连接服务端与客户端

2.创建服务端
(1)导入socket库,创建套接字serve_socket;
(2)绑定IP地址和端口:address = ('192.168.31.173', 9999);
(3)成功连接客户端后,用data存储客户端传输的数据data = client_socket.recv(1024)
(4)判断监听是否结束:如果客户端关闭连接,返回空字节,则服务端也关闭服务,如果客户端返回不是空字节,decode将传来的数据解码并打印出来,同时输入服务端回应的内容;
(5)调用close()关闭程序
(6)具体代码
python
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.31.173', 9999)
server_socket.bind(address)
server_socket.listen(5)
print("开始监听", address)
client_socket, address = server_socket.accept()
print("我们收到了{}的连接".format(address))
while True:
data = client_socket.recv(1024)
if not data:
break
print("客户端说:{}".format(data.decode())) # 解码收到的数据
response = input("服务端回应:")
client_socket.send(response.encode()) # 发送回应时需要编码
client_socket.close()
server_socket.close() # 记得关闭服务
(7)服务端运行结果

2.创建客户端
(1)导入socket库,创建套接字client_socket;
(2)运用connect,连接服务器的IP地址和端口:client_socket.connect(('192.168.31.173', 9999));
(3)用message存储用户端输入的数据并添加退出条件,客户端输入exit,则关闭连接,否则将数据进行编码后发送到服务器端;
(4)调用close()关闭程序
(5)具体代码
python
import socket # 确保导入 socket 模块
# 创建一个新的套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
client_socket.connect(('192.168.31.173', 9999))
while True:
# 发送消息到服务器
message = input("客户端说:")
if message.lower() == 'exit': # 添加退出条件
break
client_socket.send(message.encode()) # 发送消息时需要编码
# 接收服务器端的回复
data = client_socket.recv(1024).decode() # 解码接收到的数据
print("服务端回答:", data)
# 关闭连接
client_socket.close()
(6)客户端结果

2.加密解密算法和文件操作
(1)异或加密、解密算法
定义加密、解密函数,例如encode(data,key)参数data表示要加密或者解密的字符串数据,参数key表示密钥,运用for循环遍历字符串,ord(char)获取字符的Unicode码,^异或运算符号,chr()将异或操作后的整数值转化回字符。
(2)文件的基本操作
打开文件:open(file,mode=‘r’,encoding),mode包括r(只读模式),w(写入模式)a(追加模式)等
读取文件:read()
写入文件:write()
关闭文件:close()
(3)修改服务端和客户端的程序,实现加密功能
服务端
python
import socket
# 异或加密函数
def encrypt_decrypt(data, key):#data:要加密或解密的字符串数据,key: 异或操作的密钥,是一个整数
result = ""#将一个空字符赋值给result,用于后续返回加密或者解密后的字符串
for char in data:# ord(char) 获取字符的Unicode码点(整数值),^ 是异或运算符, chr() 将异或操作后的整数值转换回字符
result += chr(ord(char) ^ key)#字符拼接
return result#返回加密或者解密后的字符串
# 创建一个新的套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置地址和端口
address = ('192.168.31.173', 9999)
# 绑定
server_socket.bind(address)
# 开始监听
server_socket.listen(5)
print("开始监听", address)
# 接收连接
client_socket, address = server_socket.accept()
print("我们收到了{}的连接".format(address))
while True:
# 接收数据
data1 = client_socket.recv(1024)
if not data1:
break
# 解码收到的数据
decoded_data = data1.decode()
print("客户端说:{}".format(decoded_data))
# 使用密钥666对接收到的密文进行解密
data2 = encrypt_decrypt(decoded_data, 666)
print(data2)
# 打开文件'fuwuduan' 以写入模式,将解密后的数据保存到文件中
file_path = r'/Users/wudao/python/fuwuduan.txt'
with open(file_path, 'w') as file:
file.write(data2)
print(data2)
# 关闭连接
client_socket.close()
server_socket.close() # 记得关闭服务
客户端
python
import socket # 确保导入 socket 模块
# 异或加密函数
def encrypt_decrypt(data, key):#data:要加密或解密的字符串数据,key: 异或操作的密钥,是一个整数
result = ""#将一个空字符赋值给result,用于后续返回加密或者解密后的字符串
for char in data:# ord(char) 获取字符的Unicode码点(整数值),^ 是异或运算符, chr() 将异或操作后的整数值转换回字符
result += chr(ord(char) ^ key)#字符拼接
return result#返回加密或者解密后的字符串
#在E盘创建一个子文件new.txt
file_path = r'E:\PythonHomework\new.txt'
with open(file_path, 'w') as file:
file.write('Hello, World!')
# 创建一个新的套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到服务器
client_socket.connect(('192.168.31.173', 9999))
while True:
message = input("如果想要退出输入exit,如果不,输入no:")
if message.lower() == 'exit': # 添加退出条件
break
# 打开文件 'test.txt' 以读取模式,读取文件内容
with open(file_path , 'r') as file:
data2 = file.read()
# 使用密钥123对读取到的数据进行加密
encrypted_data = encrypt_decrypt(data2, 666)
# 将加密后的数据编码为字节流并发送给服务端
client_socket.send(encrypted_data.encode())
# 关闭连接
client_socket.close()
连接客户端程序端

服务端监听到后,创建new.txt和fuwuduan.txt两个文件,文件内容全部写入hello world
服务端运行结果


从而接收方解密内容并写入文件
4.程序托管到码云

https://gitee.com/zhaoshaoning/python.git
三、 实验过程中遇到的问题和解决过程
- 问题1:服务端与客户端连接时报错
- 问题1解决方案:询问同学后,发现需要关闭电脑的防火墙
其他(感悟、思考等)
socket网络编程为我打开了python的新世界的大门,我们现在使用的社交网络以此为基础,实验过后我的实践能力和编程能力也得到了提高。

浙公网安备 33010602011771号