20241321 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2413
姓名: 顾创
学号:20241321
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
(一)实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(二)实验要求
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
2. 实验过程及结果
一:创建服务端和客户端,服务端在特定端口监听多个客户请求。
1.实验前先进行服务端电脑ip查询

2.创建服务端(服务端代码核心及其讲解)
(1)创建一个套接字:client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
(2)绑定ip地址和端口address = ('192.168.13.248', 9999)
(3)当成功连接客户端后,用data存储客户端传输的数据data = client_socket.recv(1024)
(4)最后用close关闭程序。
(5)具体代码:
#服务端
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() # 记得关闭服务
服务端的运行结果:

3.创建客服端:
前面创建套接字和服务端相似,
只需要再加入发送消息: client_socket.send(message.encode())
具体代码:
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()
客户端的运行结果:
二:文件的基本操作:
1.重点讲解:
(1)open函数的使用,打开文件并且进行文件操作,后续为file.
file = open(filename,"w")
(2)文件的操作方式
以可写打开文件file = open(filename,"w")可读和追加分别为“r”和“a”
读文件内容:file.read()
写如文件内容:file.write(text)
关闭文件:close()
(3)运行结果:

三:发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中
1.首先将的代码进行改变,加入文件打开,加密功能。
服务端代码
#加密服务端
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() # 记得关闭服务
客户端代码:
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()
2.代码修改过后服务端和客服端两端进行加密传递:
(1)首先打开服务端后,客服端运行连接到服务端:

发送方从文件读取内容并加密传输成功
(2)服务端监听到后,创建两个叫new.txt和fuwuduan.txt的文件,文件内容全部写hello world
(3)服务端运行结果如下:


这样就实现了接收方收到密令内容破译并加到文件中。
四:程序代码托管到码云:




客服端码云:https://gitee.com/gu-chuanggo/PythonHomework/blob/master/客户端.py
加密后的码云:https://gitee.com/gu-chuanggo/PythonHomework/blob/master/7.py
3. 实验过程中遇到的问题和解决过程
- 问题1:
![]()
无法连接 - 问题1解决方案:老师讲解,关闭电脑防火墙
- 问题2:对服务端和客户端的部分代码不理解
- 问题2解决方案:询问豆包,比如
for char in data,ord(char) 获取字符的Unicode码点(整数值),^ 是异或运算符, chr() 将异或操作后的整数值转换回字符
其他(感悟、思考等)
从一个人的代码编程和使用到两个电脑的交互,初步感受电脑互联的乐趣。


浙公网安备 33010602011771号