20241415 《Python程序设计》实验三实验报告

20241415 2024-2025-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 2414
姓名: 赵邵宁
学号:20241415
实验教师:王志强
实验日期:2025年4月16日
必修/选修: 公选课

一、实验内容

1.创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;

2.要求包含文件的基本操作,例如打开和读写操作。

3.要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。

4.程序代码托管到码云。

二、 实验过程及结果

1.在终端输入ifconfig(Mac系统)查询电脑的IP地址,用于连接服务端与客户端

2.创建服务端

(1)导入socket库,创建套接字serve_socket;
(2)绑定IP地址和端口:address = ('192.168.31.173', 9999);
(3)成功连接客户端后,用data存储客户端传输的数据data = client_socket.recv(1024)
(4)判断监听是否结束:如果客户端关闭连接,返回空字节,则服务端也关闭服务,如果客户端返回不是空字节,decode将传来的数据解码并打印出来,同时输入服务端回应的内容;
(5)调用close()关闭程序
(6)具体代码

python
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()  # 记得关闭服务

(7)服务端运行结果

2.创建客户端

(1)导入socket库,创建套接字client_socket;
(2)运用connect,连接服务器的IP地址和端口:client_socket.connect(('192.168.31.173', 9999));
(3)用message存储用户端输入的数据并添加退出条件,客户端输入exit,则关闭连接,否则将数据进行编码后发送到服务器端;
(4)调用close()关闭程序
(5)具体代码

python
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()

(6)客户端结果

2.加密解密算法和文件操作

(1)异或加密、解密算法
定义加密、解密函数,例如encode(data,key)参数data表示要加密或者解密的字符串数据,参数key表示密钥,运用for循环遍历字符串,ord(char)获取字符的Unicode码,^异或运算符号,chr()将异或操作后的整数值转化回字符。
(2)文件的基本操作
打开文件:open(file,mode=‘r’,encoding),mode包括r(只读模式),w(写入模式)a(追加模式)等
读取文件:read()
写入文件:write()
关闭文件:close()
(3)修改服务端和客户端的程序,实现加密功能

服务端

python
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()  # 记得关闭服务

客户端

python
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()

连接客户端程序端

服务端监听到后,创建new.txt和fuwuduan.txt两个文件,文件内容全部写入hello world
服务端运行结果

从而接收方解密内容并写入文件

4.程序托管到码云


https://gitee.com/zhaoshaoning/python.git

三、 实验过程中遇到的问题和解决过程

  • 问题1:服务端与客户端连接时报错
  • 问题1解决方案:询问同学后,发现需要关闭电脑的防火墙

其他(感悟、思考等)

socket网络编程为我打开了python的新世界的大门,我们现在使用的社交网络以此为基础,实验过后我的实践能力和编程能力也得到了提高。

posted @ 2025-05-07 20:19  雾岛岛岛  阅读(15)  评论(0)    收藏  举报