zoukankan      html  css  js  c++  java
  • 基于udp协议的套接字

    tcp:发送数据可靠,需要建立连接,存在粘包现象
    udp:传送数据不可靠,不用建立连接,发数据效率高,不存在粘包现象

    服务端

    from socket import *
    
    server = socket(AF_INET, SOCK_DGRAM)  # 数据报协议,没有粘包问题
    server.bind("127.0.0.1", 8080)
    # udp 没有连接无listen和accept
    while True:
        data, client_addr = server.recvfrom(1024)  # 收消息
        print(data)
        server.sendto(data.upper(), client_addr)  # 回消息
    
    server.close()
    

    客户端

    from socket import *
    
    client = socket(AF_INET, SOCK_DGRAM)  # 数据报协议,没有粘包问题
    
    # udp 没有连接无listen和accept
    while True:
        msg = input(">>>:").strip()   # tcp不能为空,udp可以发空内容
        client.sendto(msg.encode("utf-8"), ("127.0.0.1", 8080))  # 发送
    
        data, server_addr = client.recvfrom(1024)  # 再发回消息
        print(data, server_addr)
    
    client.close()
    
    # sendto 和 recvfrom 一一对应
    

     


    TCP VS UDP

    tcp基于链接通信

    • 基于链接,则需要listen(backlog),指定连接池的大小
    • 基于链接,必须先运行的服务端,然后客户端发起链接请求
    • 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
    • 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)
    • 流式协议  会粘包  不可以发空 send recv 不是 一 一对应
    • tcp适用于:
      • 数据一定要可靠
      • 远程执行命令
      • 下载文件

    udp无链接

      • 无链接,因而无需listen(backlog),更加没有什么连接池之说了
      • 无链接,udp的sendto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
      • recvfrom收的数据小于sendto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
      • 只有sendto发送数据没有recvfrom收数据,数据丢失
      • 数据报协议  不会粘包 可以发空 sendto recvfrom 一 一 对应  数据报协议  数据不安全 有可能发送数据 > 1024 或者网络网络异常 数据没了
      • udp适用于
        • QQ
        • 查询操作  eg: ntp时间服务器  dns服务器(查域名,转ip)  能保证查询效率高,数据虽然不可靠
  • 相关阅读:
    一本名副其实的 Web架构“圣经”——关于《HTTP权威指南》
    图灵生日会——纪念阿兰图灵诞辰100周年及图灵公司七周年线下交流会
    跟着图灵听课去!(六月)
    “电梯演讲”最精炼、贴切的语言
    送你一把开启演讲之路的钥匙——《演讲的艺术》
    翻译是一份严谨的工作——关于HTTP中文翻译的讨论
    浪潮之巅作者吴军推荐序——《推荐系统实践》
    如何到达永生?揭示科学之美
    软件行业大牛告诉你何谓成功?
    C#线程系列讲座(3):线程池和文件下载服务器
  • 原文地址:https://www.cnblogs.com/fantsaymwq/p/10051299.html
Copyright © 2011-2022 走看看