20193118彭淇靖 2019-2020-2 《Python程序设计》实验三报告

课程:《Python程序设计》
班级: 1931
姓名: 彭淇靖
学号:20193118
实验教师:王志强
实验日期:2020年5月16日
必修/选修: 公选课

1.实验内容

创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
(1)创建服务端和客户端,选择一个通信端口,用Python语言编程实现通信演示程序;
(2)要求包含文件的基本操作,例如打开和读写操作。
(3)要求发送方从文件读取内容,加密后并传输;接收方收到密文并解密,保存在文件中。
(4)程序代码托管到码云。

2. 实验过程及结果

此处填写实验的过程及结果
利用前面所学的几个部分的知识完成实验。
(1)创建服务端和客户端
客户端
import socket

客户端的socket初始化

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 参数1:服务器之间网络通信 参数2:
s.connect(('127.0.0.1',3333))# 连接,元组的形式(ip地址,端口)

str = input("请输入要传输的内容")
s.sendall(str.encode()) # 不加编码传不过去
data = s.recv(1024)
print(data)
s.close()

服务器
import socket

客户端的socket初始化

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 参数1:服务器之间网络通信 参数2:
s.bind(('127.0.0.1',3333))# 绑定 localhost = 127.0.0.1(本机)
s.listen()# 监听
conn,address = s.accept()# 阻塞
data = conn.recv(1024)# 接收
print(data.decode())
conn.sendall(("服务器已经接收到了数据内容:"+str(data)).encode())

(2)文件的基本操作
import os
os.makedirs("C:\Users\Administrator\Desktop\1931")#创建文件夹
os.chdir("C:\Users\Administrator\Desktop\1931") # 把path设置为当前工作目录
file = open("193118","w+") # 创建文件
file.write("学号:20193118 姓名:彭淇靖 课程名称:C语言 成绩:A+")
file.close()
file = open("193118","a")
a = input("同学学号")
b = input("同学姓名")
c = input("同学课程名称")
d = input("同学成绩")
file.write("\n"+"学号:"+a+" "+"姓名:"+b+" "+"课程名称:"+c+" "+"成绩:"+d)
file.close()
file = open("193118", 'r')
file.seek(0) # 文件指针设置到开头
word = file.read()
print(word)
file.close()

在该实验中我只对原文件内容进行了读取和新文件内容进行输入,使用已经建立好的的存在内容的文件夹,并未从建立和输入内容开始

(3)加密解密(下为百度的参考代码)
base64

# coding=utf-8
import base64
import string
import random
base_str = string.ascii_letters + string.punctuation
print(base_str)
result_str = ''.join(random.choices(base_str, k=20))
print(result_str)
result = base64.encodebytes(bytes(result_str.encode('utf-8'))).decode('utf-8')
print(result)
result_back = base64.decodebytes(bytes(result.encode('utf-8'))).decode('utf-8')
print(result_back)

凯撒密码

加密

unknown = '' # 加密
for i in range(len(str)):
if ord(str[i]) < 125 and str[i] != '\n':
temp = chr(ord(str[i]) + 1)
unknown += temp+' '
else:
unknown += str[i]+' '

解密

def decode(unknown):
"""
:param unknown: 未知字符,用来拿去解密
:return: known,已经完成解密的字符
"""
known = ''
for i in range(len(unknown)-1):
if unknown[i] == '\n':
known += '\n'
elif ord(unknown[i]) <= 125:
known += chr(ord(unknown[i])-1)
return known

将以上知识点进行适当的组合运用

完整版代码如下
服务器

import socket
import os
import base64
os.chdir(r"C:\Users\Administrator\Desktop\1931")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 5555))
s.listen()
conn, address = s.accept()
name = conn.recv(1024)
print("收到", address, "的文件:", name.decode())
data = conn.recv(1024)
f = open("receive.txt", "w")
data1 = base64.b32decode(data)
f.write(data1.decode())
f.close()
print("收到", address, "加密的信息:", data.decode(), "解密后保存为receive.txt")
conn.sendall("服务器已经收到了数据内容,准备传输文件,注意接收!".encode())
data1 = conn.recv(1024)
conn.sendall("reply.txt".encode())
f = open("receive.txt", "r")
data1 = f.read()
conn.sendall(data1.encode())
f.close()
data1 = conn.recv(1024)
print("收到", address, "的信息", data1.decode())
s.close()

客户端

import socket
import os
import base64
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1', 5555))
str1 = input("传输的文件名:")
s.sendall(str1.encode())
os.chdir(r"C:\Users\Administrator\Desktop\1931")
file = open(str1,'r')
text = file.read()
text = text.encode('utf-8')
encode_text = base64.b32encode(text)
s.sendall(encode_text)
file.close()
data = s.recv(1024)
print(" ('收到新的信息:",data.decode())
s.sendall("收到".encode())
name = s.recv(1024)
print("收到新的文件:",name.decode())
data = s.recv(1024)
f = open("reply.txt","w")
f.write(data.decode())
f.close()
print("加密后已发送")
s.sendall("已接收!".encode())
s.close()

码云链接https://gitee.com/peng_qi_jing/shiyan3
运行结果

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

  • 问题1:若选择凯撒密码则不能对文本中的汉字进行加密解密,且由于本人技术有限无法运行
  • 问题1解决方案:改用base64,使得代码更加简洁方便

其他(感悟、思考等)

1、越进行操作越多的编程时所运用的知识点越多,不仅要学习单个的知识点,更要学习如何将知识点串联并运用,因此及时的回顾很重要(例如:传输的内容不加编码传不过去)
2、实现同一种功能的方法有很多种,但应选择适合的,还要考虑不同方法的局限性及使用时的区别(例如凯撒密码无法对文本中汉字进行加解密,这是一个缺陷)

posted @ 2020-05-23 22:57  20193118彭淇靖  阅读(158)  评论(0编辑  收藏