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

在上面的代码中,首先我创建了一个socket对象,其次使用ipconfig获取了同伴王梓墨的电脑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()
、、、
服务端

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://gitee.com/
https://gitee.com/jun-huaisu/pythonwork
2.使用加密



在使用Aes加密的过程中,需要下载Crypto模板,其中的一些代码经过ai的帮助成功的实现了,只是在梓墨的电脑上无法使用pip下载,在改变环境变量后,仍无法使用,在重装python后仍然无法解决,所以我就把加密方向转为比较简单的凯撒加密,通过移位实现简单的加密
客户端:




上述代码解析
、、、
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()
码云链接:
https://gitee.com/jun-huaisu/pythonwork
服务端:





结果:

3. 实验过程中遇到的问题和解决过程
- 问题1:在弄IP的过程中发现单纯使用ipconfig并不能得到
- 问题1解决方案:寻求Ai找到了改变和添加环境变量的方法后来又寻求了老师的帮助,发现是python解释器的问题
- 问题2:在连接过程中经常遇到积极拒绝连接的问题
- 问题2解决方案:寻求了老师的帮助
- 问题3:在安装Crypto模板的过程中发现同伴的电脑不能使用pip安装
- 问题3解决方案:寻求了AI的帮助,通过添加路径解决
其他(感悟、思考等)
感觉客户端和服务端的连接很神奇,在这个过程中虽然遇到了很多的困难,但也有很多的收获,这也要感谢王老师的帮助
其次就是这个过程也激发了我对加密的探索,在网站上学习了有关Aes加密和Des的相关内容
参考资料
-
零基础学python
-
豆包
-
...

浙公网安备 33010602011771号