zoukankan      html  css  js  c++  java
  • 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("你好
    ")                            #写入信息
    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("
    文件发送成功")
    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("
    解密内容:"+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的出现再次提醒了我,实现复杂功能的代码时要分块处理,不然很容易出现问题。

  • 相关阅读:
    如何处理大数据量抽数长期无响应
    处理链报错邮件通知
    BW数据源深入研究【转自WKingChen的博客】
    BW:处理链报错解决步骤
    创建自己的Convers. Routine.
    vs2005 创建 C++ Dll项目
    C++之模板
    delphi 的 pos 函数 对中文支持不好。
    delphi中 socket 心跳包的实现
    C++ UTF8编码转换 CChineseCode
  • 原文地址:https://www.cnblogs.com/hantaku/p/12900601.html
Copyright © 2011-2022 走看看