zoukankan      html  css  js  c++  java
  • python 之 网络编程(基于UDP协议的套接字通信)

    8.5 基于UDP协议的套接字通信

    UDP协议:数据报协议 特点:无连接,一发对应一收,先启动哪一端都不会报错 优点:发送效率高,但有效传输的数据量最多为500bytes

    缺点:不可靠:发送数据,无需确认,容易丢包

    udp服务端

    1 ss = socket()   #创建一个服务器的套接字
    2 ss.bind()       #绑定服务器套接字
    3 inf_loop:       #服务器无限循环
    4     cs = ss.recvfrom()/ss.sendto() # 对话(接收与发送)
    5 ss.close()                         # 关闭服务器套接字

    udp客户端

    cs = socket()   # 创建客户套接字
    comm_loop:      # 通讯循环
        cs.sendto()/cs.recvfrom()   # 对话(发送/接收)
    cs.close()                      # 关闭客户套接字

    8.6 客户端与服务端操作( 基于UDP )

    服务端:

    import socket
                       #地址家族,基于网络   # 数据报协议     
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 
    server.bind(('127.0.0.1',8080))                 #把地址绑定到套接字(0-65535) 0-1024给系统用的
    while True:
        client_data,client_addr=server.recvfrom(1024)#收消息,1024是一个最大的限制
        print(client_data.decode('utf-8'))
        msg=input('回复%s:%s>>>:' %(client_addr[0],client_addr[1]))
        server.sendto(msg.encode('utf-8'),client_addr)

    客户端:

    import socket
    ​
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议
    while True:
        msg=input('>>>: ').strip()
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
        res,server_addr=client.recvfrom(1024)             #收消息
        print(res.decode('utf-8'))

    8.7 数据报协议没有粘包问题

    udp的recvfrom是阻塞的,一个recvfrom(x)必须对唯一一个sendinto(y),收完了x个字节的数据就算完成,若是y>x数据就丢失,这意味着udp根本不会粘包,但是会丢数据,不可靠

    每个UDP包中就有了消息头(消息来源地址,端口等信息),这样对于接收端来说,就容易进行区分处理了。 即面向消息的通信是有消息保护边界的。

    服务端:

    import socket
    ​
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议
    server.bind(('127.0.0.1',8080))
    ​
    res1,client_addr=server.recvfrom(1)             #b'h'
    print(res1)
    ​
    res2,client_addr=server.recvfrom(2)             #b'wo'
    print(res2)
    ​
    res3,client_addr=server.recvfrom(3)             #b'ego'
    print(res3)

    客户端:

    import socket
    ​
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议
    ​
    client.sendto(b'hello',('127.0.0.1',8080))
    client.sendto(b'world',('127.0.0.1',8080))
    client.sendto(b'egon',('127.0.0.1',8080))
  • 相关阅读:
    ubutu安装phonegap 后出现/usr/bin/env:node No such file or directory的错误
    Ubuntu 14.04 x64 安装 Android SDK
    ubuntu64安装ia32-libs
    redis 配置
    flask部署阿里云
    爬虫数据存储
    selnuim 使用
    python 爬虫解析_1_
    scrapy 数据存储mysql
    scrapy 小案例
  • 原文地址:https://www.cnblogs.com/mylu/p/11203862.html
Copyright © 2011-2022 走看看