zoukankan      html  css  js  c++  java
  • Python学习之——Socket套接字(UDP连接)

    基于UDP的socket

    面向无连接的不可靠数据传输,可以没有服务器端,只不过没有服务器端,发送的数据会被直接丢弃,并不能到达服务器端

    由于UDP是面向无连接的(实际上有链接,不然通过什么去传数据去取数据),可以使用多个客户端连接服务端,但这并不是并发访问。

    注意:

    1. 发消息,都是将数据发送到己端的发送缓冲中,收消息都是从己端的缓冲区中收

       tcp:send发消息,recv收消息

       udp:sendto发消息,recvfrom收消息

    2. tcp是基于数据流的,而udp是基于数据报的:

      send(bytes_data):发送数据流,数据流bytes_data若为空,自己这段的缓冲区也为空,操作系统不会控制tcp协议发空包

      sendinto(bytes_data,ip_port):发送数据报,bytes_data为空,还有ip_port,所有即便是发送空的bytes_data,数据报其实也不是空的,自己这端的缓冲区收到内容,操作系统就会控制udp协议发包。

    3.1 tcp协议

    (1)如果收消息缓冲区里的数据为空,那么recv就会阻塞(阻塞很简单,就是一直在等着收)

    (2)只不过tcp协议的客户端send一个空数据就是真的空数据,客户端即使有无穷个send空,也跟没有一个样。

    (3)tcp基于链接通信

    • 基于链接,则需要listen(backlog),指定半连接池的大小
    • 基于链接,必须先运行的服务端,然后客户端发起链接请求
    • 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
    • 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)

    3.2 udp协议

    (1)如果如果收消息缓冲区里的数据为“空”,recvfrom也会阻塞

    (2)只不过udp协议的客户端sendinto一个空数据并不是真的空数据(包含:空数据+地址信息,得到的报仍然不会为空),所以客户端只要有一个sendinto(不管是否发送空数据,都不是真的空数据),服务端就可以recvfrom到数据。

    (3)udp无链接

    • 无链接,因而无需listen(backlog),更加没有什么连接池之说了
    • 无链接,udp的sendinto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
    • recvfrom收的数据小于sendinto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
    • 只有sendinto发送数据没有recvfrom收数据,数据丢失

    实现代码

    服务端:

    #导入socket模块
    import socket
    #创建socket
    skt = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    #绑定地址和端口
    skt.bind(('127.0.0.1',9090))
    #循环
    while True:
        #调用接受消息
        data,addr = skt.recvfrom(1024)
        #接受成功回复消息
        rst = b'I am fine'
        skt.sendto(rst,addr)
        print('server Done')
        #关闭链接
        skt.close()

    客户端

    #导入模块
    import socket
    #创建socket
    skt  = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    #创建发送消息和发送目标
    msg = b'Hello world'
    addr = ('127.0.0.1',9090)
    skt.sendto(msg,addr)
    #接受回复
    rst = skt.recvfrom(1024)
    print(rst)
    print('client done')
    #关闭链接
    skt.close()
    

      

  • 相关阅读:
    人工智能搜索算法(深度优先、迭代加深、一致代价、A*搜索)
    四.redis 事务
    三.redis 排序
    二.redis 数据类型
    一.redis 环境搭建
    Redis几个认识误区
    key-list类型内存数据引擎介绍及使用场景
    牛人推荐机器学习网站
    Android Studio 快捷键整理分享
    人工智能和机器学习领域中有趣的开源项目
  • 原文地址:https://www.cnblogs.com/yuxiang-qiwa/p/7965980.html
Copyright © 2011-2022 走看看