20241105 王梓墨 实验三 《Python程序设计》实验报告

课程:《Python程序设计》
班级: 2411
姓名: 王梓墨
学号:20241105
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课
1.实验内容
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。
2. 实验过程及结果
在使用socket的过程中,我根据老师在课堂上讲的对客户端和服务端代码的实现,在尝试了许多次后,终于完成了对于信息的传递
(1)首先我简单使用了客户端与服务端的连接工作
(2)其次,在加密过程中,因为一些问题,使用了凯撒加密
3.实验代码
(1)客户端

在上面的代码中,首先由钧涛创建了一个socket对象,并获取了我的电脑ip
`import socket
新建Socket,实例化
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
连接服务器
client_socket.connect(('192.168.25.199', 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"))

client_socket.close()(2)服务端 ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512203211647-883471706.png) address = ('localhost', 9999)在写服务端代码时因为疏忽多写了这一行代码,导致程序无法运行import socket

创建一个TCP/IP套接字对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

定义服务器要绑定的地址和端口
address = ('192.168.25.199', 9999)

将套接字绑定到指定的地址和端口
server_socket.bind(address)

开始监听客户端连接,最大连接数为1
server_socket.listen(1)

print("开始监听....")

接受客户端的连接请求,返回一个新的套接字对象和客户端地址
client_socket, address = server_socket.accept()
print("我们收到{}的连接".format(address))

while True:
接收客户端发送的数据,最大接收1024字节
data = client_socket.recv(1024)
if not data:
如果没有接收到数据,说明客户端关闭了连接,退出循环
break
print("客户端说:{}".format(data.decode("utf-8")))
服务器输入回应内容并发送给客户端
client_socket.send(input("服务端回应:").encode("utf-8"))

关闭与客户端的连接
client_socket.close()结果如下: ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512204404505-815906720.png) 4.加密 ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512204729801-1481465813.png) ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512204808775-1627580101.png) ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512204841714-1112250816.png) 在使用Aes加密的过程中,需要下载Crypto模板,其中的一些代码经过ai的帮助成功的实现了,只是不知为何在我的电脑上始终无法实现pip下载,在改变环境变量后,仍无法完成,在重装python后仍然无法解决,因此我们就将加密方向转为比较简单的凯撒加密,通过移位实现简单的加密 (1)客户端 ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512205228762-617380303.png) ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512205736644-1361771723.png) ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512205820369-202108437.png) ![](https://img2024.cnblogs.com/blog/3614330/202505/3614330-20250512205916644-2070312865.png)import socket

凯撒加密函数
def caesar_encrypt(message, shift=3):
result = ""
for char in message:
if char.isalpha():
if char.islower():
result += chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
else:
result += chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
else:
result += char
return result

凯撒解密函数
def caesar_decrypt(message, shift=3):
return caesar_encrypt(message, -shift)

创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
连接服务器
server_address = ('192.168.25.199', 9998)
client_socket.connect(server_address)

while True:
输入消息
message = input('客户端输入: ')
计算加密后的消息
encrypted_message = caesar_encrypt(message)
发送加密后的消息长度
client_socket.send(len(encrypted_message).to_bytes(4, 'big'))
发送加密后的消息
client_socket.send(encrypted_message.encode('utf-8'))
接收服务器发送的消息长度
message_length_bytes = client_socket.recv(4)
if not message_length_bytes:
break
message_length = int.from_bytes(message_length_bytes, 'big')
接收服务器发送的加密消息
encrypted_response = b''
received_length = 0
while received_length < message_length:
chunk = client_socket.recv(min(1024, message_length - received_length))
if not chunk:
break
encrypted_response += chunk
received_length += len(chunk)

解密服务器发送的消息
decrypted_response = caesar_decrypt(encrypted_response.decode('utf-8'))

print(f'服务器: {decrypted_response}')
关闭连接
client_socket.close()
`
(2)服务端





结果如下:

5.实验过程中遇到的问题和解决过程

  • 问题1:在连接过程中遇到积极拒绝连接的问题
  • 问题1解决方案:向老师寻求帮助
  • 问题2:我的电脑不能使用pip安装Crypto模板
  • 问题2解决方案:寻求了AI的帮助,通过添加路径解决
    6.感悟与思考
    仅仅通过几行代码,就能够实现服务端与客户端的连接,感受到了编程的神奇,领会到了代码改变世界
    7.参考资料
    零基础学Python
posted @ 2025-04-30 19:00  王梓墨  阅读(23)  评论(0)    收藏  举报