• 20191318实验三 Socket编程技术


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

    课程:《Python程序设计》
    班级: 1913
    姓名: 王泽文
    学号:20191318
    实验教师:王志强
    实验日期:2020年4月11日
    必修/选修: 公选课

    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(('192.168.137.1', 800))
       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(('192.168.137.1', 800))
       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/python_programming/wzw20191318/commit/608c38547522b6349c78efde93dece5195aef673

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

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

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

    4. 思考和感悟

    • socket模块有很多有意思的东西,我还需要更深入的去学习。

    参考资料

  • 相关阅读:
    php去除数组中重复值,并返回结果!
    SignalR 2 入门
    SignalR支持的平台
    SignalR简介
    作业调度系统quartz.net
    Oracle安装心得
    maven的项目目录解析
    web.xml的<url-parttern>的匹配规则
    Web.xml中四种验证方式
    Web.xml
  • 原文地址:https://www.cnblogs.com/wzwyoshino/p/12944489.html
Copyright © 2020-2023  润新知