芝兰生于深林,不以无人而不芳。


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

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的出现再次提醒了我,实现复杂功能的代码时要分块处理,不然很容易出现问题。

posted @ 2020-05-16 15:51  20192416  阅读(206)  评论(0编辑  收藏  举报