• ~~网络编程(八):UDP~~


    进击のpython

    *****

    网络编程——UDP


    那现在看到这里的

    这就是网络编程的最后一讲了

    上面讲的都是关于TCP的编程方法

    还记得TCP和UDP传输的区别吗?

    UDP简单就简单到它可以不借助管道来进行数据的传输

    那要怎那么通过套接字方法来进行UDP方式的信息传输呢?


    老规矩,信息收发创建两个py文件,服务端和客户端

    server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    

    还记得这句话在TCP怎么写的吧

    在这里数据传输方式用的是“数据报模式”,所以UDP协议也叫数据报协议

    (phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM))

    在这就要讲了,流式协议是不是有粘包现象啊

    不好意思熬,在UDP这根本就没有这个现象

    我们发现这个socket.socket每次都写很麻烦

    所以我们可以在开始导入模块的时候这么写

    form socket import *
    

    虽然说不建议用*来导入模块,但是由于我们要使用的方法太多了

    所以说,就可以对这个模块全部导入

    所以上面的方法就可以写成

    server = socket(socket.AF_INET,socket.SOCK_DGRAM)
    

    那什么绑定端口,绑定IP,是不是都需要?

    server.bind(("127.0.0.1", 8080))
    

    那需不需要监听呢?server.listen(5)

    我这是UDP,有链接嘛?是不是没有?所以不需要监听

    那需不需要server.accept()呢?

    还是这句话,accept是为了链接才使用的,我UDP没有链接,所以也不要

    那没有链接,是不是不需要链接循环了啊

    那通信循环是不是还应该要啊

    在UDP中,收消息叫 recvfrom() 发消息用 sendto()

    while 1:
        data = server.recvfrom(1024)
        print(data)
    server.close()
    

    那服务端就写完了

    接下来就是客户端了

    客户端需不需要绑定IP? 当然不需要!

    客户端需不需要建立管道?当然不需要!

    那我能不能发送空呢?

    对于TCP来说是不能的,那看看UDP呢

     msg = input(">>>")
     client.sendto(msg.encode("utrf-8"),("127.0.0.1", 8080))
    

    sendto接收两个参数,第一个是你发送的信息,第二个是你要发给的ip和端口号的元组形式

    那,客户端和服务端就写完了

    # 客户端
    from socket import *
    
    client = socket(AF_INET, SOCK_DGRAM)
    
    while 1:
        msg = input(">>>")
        client.sendto(msg.encode("utf-8"), ("127.0.0.1", 8080))
    
    client.close()
    
    # 服务端
    from socket import *
    
    server = socket(AF_INET, SOCK_DGRAM)
    server.bind(("127.0.0.1", 8080))
    
    while 1:
        data = server.recvfrom(1024)
        print(data)
    server.close()
    
    # 客户端
    >>>haha
    >>>dawdadwad
    >>>fdafwa
    
    # 服务端
    (b'haha', ('127.0.0.1', 63671))
    (b'dawdadwad', ('127.0.0.1', 63671))
    (b'fdafwa', ('127.0.0.1', 63671))
    

    然后我发现,我的data接收的是一个元组形式

    前面的是发送的内容,后面的是客户端的ip和端口

    我要内容我能理解,那我为啥还要他的ip和端口啊?

    很简单,因为我得知道这个数据是谁给我发的啊,然后我好回啊

    那就完成了服务端与客户端的交互了

    data,client_addr = server.recvfrom(1024)
    server.sendto(data.upper(),client_addr)
    

    解决上面提出的问题,当我发空的时候,也是可以运行的,所以不用考虑空的问题

    而且,因为他是数据报协议,每次发的时候其实就是把所有的信息都发过来了

    这样每个数据之间就不存在联系,也就没有粘包的可能性


    那既然这么方便,为什么不用UDP啊

    还记得我们说过他的不安全吗?

    如果数据传输中经历了网络波动,那信息就没有了

    而且别人也不会再给你发一遍

    再一个就是,接收信息可能不会完整(你试试把recvfrom()里面的数字变成1看看效果)

    所以有这两种的不稳定性

    UDP协议传输方式就不适合下载文件或者远程命令

    但是查询东西用的就是UDP协议

    QQ信息传输也是UDP协议

    查询要的就是快,不可靠大不了我再查一遍

    但是总归来说,TCP用的还是挺多的


    这一part的东西其实挺少的,大部分都是概念为主

    从刚开始的五层协议,进而了解到两个协议

    然后通过套接字方法搭建起应用层和传输层的桥梁

    接着对TCP协议模式的信息传输进行了仔细的分析

    研究出一套近乎通用的模板

    最后提了一下UDP协议的使用以及相对于TCP来说的优缺点

    下一部分就是并发编程了,有兴趣的继续关注我吧!


    *本part结束*
    *写几个番外*
  • 相关阅读:
    React.memo()使用教程
    React组件什么时候render
    redux-thunk使用教程
    Redux数据持久化
    Mac 中安装 nvm: 切换Node 不同版本
    上传文件类型选择
    Python获取软件安装列表
    Java读取text文件
    负载均衡
    远程调用
  • 原文地址:https://www.cnblogs.com/jevious/p/11402236.html
Copyright © 2020-2023  润新知