20241216 实验三《Python程序设计》实验报告
20241216 2024-2025-2 《Python程序设计》实验三报告
课程:《Python程序设计》
班级: 2412
姓名: 曾楷
学号:20241216
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
一.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
二. 实验过程及结果
1.创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(1)作为客户端
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''连接服务器'''
client_socket.connect(("192.168.30.2", 9999))
while True:
client_socket.send(input("zk说:").encode())
data = client_socket.recv(1024)
print("wk回答:",data.decode())
if client_socket.send(input("退出请输入q"))=='q':
break
client_socket.close()
直接使用代码发现只能运行一轮,觉得是退出逻辑有问题

发现“client_socket.send()”方法返回的是成功发送的字节数量,并非发送的内容,因此不能用它来判断是否输入了q
以此进行修改
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''连接服务器'''
client_socket.connect(("192.168.30.2", 9999))
while True:
message = input("zk说:")
client_socket.send(message.encode())
if message.lower() == 'q':
break
data = client_socket.recv(1024)
print("wk回答:", data.decode())
client_socket.close()
成功运行

(2)作为服务端
import socket
'''新建服务端socket'''
server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address=('192.168.30.2',9999)
'''绑定'''
server_socket.bind(address)
'''监听'''
server_socket.listen(5)
'''接受'''
client_socket, address = server_socket.accept()
print("我们收到了{}的链接".format(address))
while True:
data=client_socket.recv(1024)
if not data:
break
print("slave wk说:{}".format(data.decode()))
client_socket.send(input("master zk回应:").encode())
'''关闭连接'''
client_socket.close()
显示地址无效

对方显示

发现是IDv4的地址出现问题,双方应当输入服务端的地址,因为服务端需要绑定并监听
修改后成功运行

2.要求包含文件的基本操作,例如打开和读写操作
3.要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
客户端代码
使用凯撒密码加密,将文本通过后移(shift == 3)位,将input.txt发送给服务端
import socket
'''使用凯撒密码加密'''
def encrypt(text, shift):
result = ""
for char in text:
if char.isalpha():
start = ord('A') if char.isupper() else ord('a')
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
'''读取文件内容'''
try:
with open('input.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("文件未找到,请确保 input.txt 文件存在。")
exit()
'''加密内容'''
shift = 3
encrypted_content = encrypt(content, shift)
'''创建客户端 socket'''
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''连接服务器'''
server_address = ('192.168.30.2', 9999)
client_socket.connect(server_address)
'''发送加密内容'''
client_socket.send(encrypted_content.encode())
'''关闭连接'''
client_socket.close()
input.txt内容

服务端代码
import socket
'''解码凯撒密码'''
def decrypt(text, shift):
return encrypt(text, -shift)
'''凯撒密码加密'''
def encrypt(text, shift):
result = ""
for char in text:
if char.isalpha():
start = ord('A') if char.isupper() else ord('a')
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
'''创建服务器 socket'''
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''绑定地址和端口'''
server_address = ('127.0.0.1', 9999)
server_socket.bind(server_address)
'''监听'''
server_socket.listen(1)
print("等待客户端连接...")
client_socket, client_address = server_socket.accept()
print(f"客户端 {client_address} 已连接。")
'''接收加密内容'''
encrypted_content = client_socket.recv(4096).decode()
'''解密内容'''
shift = 3
decrypted_content = decrypt(encrypted_content, shift)
'''将解密后的内容保存到文件'''
try:
with open('output.txt', 'w') as file:
file.write(decrypted_content)
print("解密后的内容已保存到 output.txt。")
except Exception as e:
print(f"保存文件时出错: {e}")
'''关闭连接'''
client_socket.close()
server_socket.close()
服务端结果


4.把通信和文件传输结合一下
客户端代码
import socket
'''凯撒密码加密'''
def encrypt(text, shift):
result = ""
for char in text:
if char.isalpha():
start = ord('A') if char.isupper() else ord('a')
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
'''凯撒密码解密'''
def decrypt(text, shift):
return encrypt(text, -shift)
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''连接服务器'''
client_socket.connect(("192.168.190.2", 9999))
shift = 3
while True:
choice = input("输入 1 从文件读取内容发送,输入 2 手动输入内容发送,输入 q 退出:")
if choice == 'q':
break
elif choice == '1':
try:
with open('input.txt', 'r') as file:
content = file.read()
encrypted_content = encrypt(content, shift)
client_socket.send(encrypted_content.encode())
except FileNotFoundError:
print("文件未找到,请确保 input.txt 文件存在。")
elif choice == '2':
message = input("zk 说:")
encrypted_message = encrypt(message, shift)
client_socket.send(encrypted_message.encode())
encrypted_data = client_socket.recv(1024).decode()
decrypted_data = decrypt(encrypted_data, shift)
print("wk 回答:", decrypted_data)
client_socket.close()
服务端代码
import socket
'''凯撒密码加密'''
def encrypt(text, shift):
result = ""
for char in text:
if char.isalpha():
start = ord('A') if char.isupper() else ord('a')
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char
return result
'''凯撒密码解密'''
def decrypt(text, shift):
return encrypt(text, -shift)
''' 新建服务端 socket'''
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
address = ('192.168.190.2', 9999)
'''绑定'''
server_socket.bind(address)
'''监听'''
server_socket.listen(5)
'''接受'''
client_socket, address = server_socket.accept()
print("我们收到了{}的链接".format(address))
shift = 3
while True:
encrypted_data = client_socket.recv(1024).decode()
if not encrypted_data:
break
decrypted_data = decrypt(encrypted_data, shift)
print("slave wk 说:{}".format(decrypted_data))
try:
with open('output.txt', 'a') as file:
file.write(decrypted_data + '\n')
print("收到的内容已保存到 output.txt。")
except Exception as e:
print(f"保存文件时出错: {e}")
message = input("master zk 回应:")
encrypted_message = encrypt(message, shift)
client_socket.send(encrypted_message.encode())
'''关闭连接'''
client_socket.close()
server_socket.close()
客户端运行

服务端运行


5.程序代码托管到码云
https://gitee.com/masterzk01/py-homework/blob/master/实验3.1.py
https://gitee.com/masterzk01/py-homework/blob/master/实验3.2.py
三. 实验过程中遇到的问题和解决过程
- 问题1:不知道怎么上传文件
- 问题1解决方案:将文件放在py程序所在目录进行上传
- 问题2:在完成最后一项时发送和接收出现乱码
- 问题2解决方案:因为使用了凯撒加密,应当使用英文传输
四. 其他(感悟、思考等)
在实验时因为文件操作使用不是很熟练,遇到了很多阻碍,但是通过查阅资料还是成功攻克,还是很有成就感的

浙公网安备 33010602011771号