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() 将异或操作后的整数值转换回字符

其他(感悟、思考等)

从一个人的代码编程和使用到两个电脑的交互,初步感受电脑互联的乐趣。

参考资料

posted @ 2025-05-05 15:40  20241321  阅读(40)  评论(0)    收藏  举报