20192416 《Python程序设计》实验三报告
课程:《Python程序设计》
班级:1924
姓名:不愿透露姓名的はんたくさん
学号:20192416
实验教师:王志强老师
实验日期:2020年5月16日
必修/选修: 公选课
1.实验内容
创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。
2. 实验过程及结果
功能
实现了两个终端间的实时通信
服务器端创建打开txt文件,读取、编码后发送;客户端接受编码后的内容解码,创建打开txt文件后将其写入。
server端代码
import socket
import os
os.mkdir(r"C:\\Users\\12786\\Desktop\\发送方")#创建目录
os.chdir("C:\\Users\\12786\\Desktop\\发送方") #移动到这个目录
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',8001))
s.listen()
conn,address = s.accept()
print("通信演示程序,输入0结束")
client = conn.recv(1024) #先接收客户端的信息
server = 1
while str(server) != "0" and client.decode()!="0": #server是服务器输入内容
print("客户端:",client.decode())
server = str(input("输入:"))
if server == "0":
break
conn.sendall(("服务器:"+str(server)).encode())
client = conn.recv(1024)
conn.sendall(("对话结束").encode())
print("对话结束")
print("下面进行文件的加密传输")
file = open("发送方文件.txt","w") #创造打开文件
file.write("你好\n") #写入信息
file.close()
file = open("发送方文件.txt","r")
clientf = file.read()
file.close() #关闭文件
print("文件内容预览:"+ clientf)
print("文件内容加密后预览:"+str((clientf).encode('utf-8')))
conn.send(clientf.encode('utf-8')) #发送加密信息
print("\n文件发送成功")
s.close()
client端代码
import socket
import os
os.mkdir(r"C:\\Users\\12786\\Desktop\\接受方")#创建目录
os.chdir("C:\\Users\\12786\\Desktop\\接受方") #移动到这个目录
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',8001))
print("通信演示程序,输入0结束")
server = "1"
client = 1
client = input("输入:")
s.sendall(client.encode())
server = s.recv(1024)
while str(client)!="0" and server.decode()!="对话结束":
print (server.decode()) #服务器:xxxxxx
client = input("输入:")
s.sendall(client.encode())
server = s.recv(1024)
print(server.decode())
print("下面进行文件的加密传输")
serverf = s.recv(1024) #接收文件内容
file = open("接受.txt","w")
file.write("加密内容:"+str(serverf))
file.write("\n解密内容:"+serverf.decode("utf-8"))
file.close()
file = open("接受.txt","r")
print(file.read())
file.close()
s.close()
实验结果截图
3. 实验过程中遇到的问题和解决过程
问题1:实时通信的内容被弄错成后面的传输文件内容进行了传输
问题1解决方案:将两部分代码分开编写,先将通信的代码完成,彻底杜绝数据交叉的现象
问题2:编写 print("文件内容加密后预览:"+(clientf).encode('utf-8')) 这句时发生了错误TypeError: can only concatenate str (not "bytes") to str如图
问题2解决方案:网上查找错误的相关内容,发现是因为encode转码返回的是bytes类型的数据,不可以和str类型的数据直接相加。所以将其改成了 print("文件内容加密后预览:"+str((clientf).encode('utf-8')))
问题3:不知道怎么传输文件
问题3解决方案:问了同学,发来一堆奇妙的代码。于是看群里的回放,得到了提示。先用read函数读取内容,再传输,而不是直接传文件。
感悟
本次实验不太顺利,花了比较长的时间。能力有限,被加密过程难住了,只用了utf-8编码代替加密过程非常可惜。问题1的出现再次提醒了我,实现复杂功能的代码时要分块处理,不然很容易出现问题。