zoukankan      html  css  js  c++  java
  • 20191331 《Python程序设计》实验三报告

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

    课程:《Python程序设计》
    班级: 1913
    姓名: 刘宇轩
    学号:20191331
    实验教师:王志强
    实验日期:2021年5月30日
    必修/选修: 公选课

    1. 实验内容

    • 创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套接字(TCP/UDP)进行通信。

    2. 实验过程及结果

    1. 使用socket模块进行编写客户端和服务端,并使用base64对文件进行加密

    服务端代码如下

    import socket
    import base64
    
    
    def base64_decode(name, ciphertext):
       ciphertext = ciphertext.encode('utf-8')
       ciphertext = base64.b64decode(ciphertext)
       result = ciphertext.decode('utf-8')
       f0 = open(name, "w+")
       f0.write(result)
       f0.close()
       return result
    
    
    print("正在等待连接。。。。")
    while True:
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       s.bind(('127.0.0.1', 60000))
       s.listen()
       conn, address = s.accept()
       txet = conn.recv(1024)
       print(txet.decode('utf-8'))
       data0 = conn.recv(1024)
       if data0.decode('utf-8') == "对方已退出":
           print(data0.decode('utf-8'))
           s.close()
       elif data0.decode('utf-8') == "正在发送文件":
           print("正在接收文件。。。。")
           name = conn.recv(1024)
           data = conn.recv(1024)
           base64_decode(name.decode('utf-8'), data.decode('utf-8'))
           print("已接收:"+name.decode('utf-8'))
           conn.sendall("发送成功".encode('utf-8'))
       else:
           print("客户端:"+data0.decode('utf-8'))
           conn.sendall(("服务端已接收:" + str(data0.decode('utf-8'))).encode('utf-8'))
    

    客户端代码如下

    import socket
    import base64
    
    
    def base64_encode(ad, name):
       f0 = open(ad + name, "r+")
       str = f0.read()
       pp = str.encode('utf-8')
       pp = base64.b64encode(pp)
       pp = pp.decode('utf-8')
       return pp
    
    
    while True:
       s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       s.connect(('127.0.0.1', 60000))
       s.sendall("连接成功".encode('utf-8'))
       a = int(input("1.通信 2.传输文件 3.退出
    请输入:"))
       if a == 1:
           str = input("输入:")
           s.sendall(str.encode('utf-8'))
           data = s.recv(1024)
           print(data.decode('utf-8'))
       elif a == 2:
           s.sendall("正在发送文件".encode('utf-8'))
           ad = input("请输入文件地址:")
           name = input("请输入文件名:")
           s.sendall(name.encode('utf-8'))
           str = base64_encode(ad, name)
           s.sendall(str.encode('utf-8'))
           data = s.recv(1024)
           print(data.decode('utf-8'))
    
       else:
           str = "对方已退出"
           s.sendall(str.encode('utf-8'))
           print("已退出")
           s.close()
           break
    

    运行效果如图
    ![基本功能效果]

    客户端
    ![基本功能效果]

    服务端
    ![基本功能效果]

    代码链接
    客户端
    https://gitee.com/DKY2019/lyx13579522789/blob/master/socket_c.py
    服务端
    https://gitee.com/DKY2019/lyx13579522789/blob/master/socket_s.py

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

    1. 在socket接收时只能接收一次数据

    解决方法:每一次sendall都需要一次recv来接收

    4. 思考和感悟

    • socket模块有很多有意思的东西,我还需要更深入的去学习。
  • 相关阅读:
    [leetcode]Valid Number
    [leetcode]Edit Distance
    [leetcode]Decode Ways
    [leetcode]Maximum Depth of Binary Tree
    [topcoder]BadNeighbors
    [topcoder]ZigZag
    [leetcode]Subsets II
    [leetcode]Merge Sorted Array
    [leetcode]Binary Tree Maximum Path Sum
    hdu 2964 Prime Bases(简单数学题)
  • 原文地址:https://www.cnblogs.com/DKYcaiji/p/14832921.html
Copyright © 2011-2022 走看看