美文网首页程序员
Python UDP编程

Python UDP编程

作者: PythonMaO | 来源:发表于2017-06-14 22:10 被阅读1426次

    1. UDP

    UDP,用户数据报传输协议,它位于TCP/IP协议的传输层,是一种无连接的协议,它发送的报文不能确定是否完整地到达了另外一端

    • TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议。
    • 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。
    • 虽然用UDP传输数据不可靠,但它的优点是和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。
    • 我们来看看如何通过UDP协议传输数据。和TCP类似,使用UDP的通信双方也分为客户端和服务器。服务器首先需要绑定端口

    2. TCP/IP协议(族)

    早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容
    为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。
    因为互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议

    3. 端口

    根据IP找到这台电脑,根据端口port找到进程。

    1. 端口号
      在linux系统中,端口可以有65536(2的16次方)个之多!
      既然有这么多,操作系统为了统一管理,所以进行了编号,这就是端口号
      端口是通过端口号来标记的,端口号只有整数,范围是从0到65535
    2. 知名端口(Well Known Ports)
      知名端口是众所周知的端口号,范围从0到1023
    80端口分配给HTTP服务
    21端口分配给FTP服务
    

    可以理解为,一些常用的功能使用的号码是估计的,好比 电话号码110、10086、10010一样
    一般情况下,如果一个程序需要使用知名端口的需要有root权限

    1. 动态端口(Dynamic Ports)
      动态端口的范围是从1024到65535
      之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。
      动态分配是指当一个系统进程或应用程序进程需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。
      当这个进程关闭时,同时也就释放了所占用的端口号。
    2. 怎样查看端口 ?
      用“netstat -an”查看端口状态 本地地址后面的就是端口号
    C:\Users\Administrator>netstat -an
    
    活动连接
    
      协议  本地地址          外部地址        状态
      TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
      TCP    0.0.0.0:443            0.0.0.0:0              LISTENING
      TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
      TCP    0.0.0.0:902            0.0.0.0:0              LISTENING
      TCP    0.0.0.0:912            0.0.0.0:0              LISTENING
      TCP    0.0.0.0:1688           0.0.0.0:0              LISTENING
    ..............
    ..............
    

    用“netstat -ano”查看端口状态,还有pid

    C:\Users\Administrator>netstat -ano
    
    活动连接
    
      协议  本地地址          外部地址        状态           PID
      TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       904
      TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       2268
      TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
      TCP    0.0.0.0:902            0.0.0.0:0              LISTENING       2056
      TCP    0.0.0.0:912            0.0.0.0:0              LISTENING       2056
      TCP    0.0.0.0:1688           0.0.0.0:0              LISTENING       3648
      TCP    0.0.0.0:2425           0.0.0.0:0              LISTENING       3016
    

    4. ip地址

    1. ip地址:用来在网络中标记一台电脑的一串数字,比如192.168.1.1;在本地局域网上是惟一的。
    2. ip地址的分类
      每一个IP地址包括两部分:网络地址和主机地址
    1. A类IP地址
      一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”,
      地址范围1.0.0.1-126.255.255.254
      二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110
      可用的A类网络有126个,每个网络能容纳1677214个主机
    2. B类IP地址
      一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,
      地址范围128.1.0.1-191.255.255.254
      二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110
      可用的B类网络有16384个,每个网络能容纳65534主机
    3. C类IP地址
      一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”
      范围192.0.1.1-223.255.255.254
      二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111110 11111110
      C类网络可达2097152个,每个网络能容纳254个主机
    4. D类地址用于多点广播
      D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。
      它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中
      多点广播地址用来一次寻址一组计算机
      地址范围224.0.0.1-239.255.255.254
    5. E类IP地址
      以“1111”开始,为将来使用保留
      E类地址保留,仅作实验和开发用
    6. 私有ip
      在这么多网络IP中,国际规定有一部分IP地址是用于我们的局域网使用,也就
      是属于私网IP,不在公网中使用的,它们的范围是:
    10.0.0.0~10.255.255.255
    172.16.0.0~172.31.255.255
    192.168.0.0~192.168.255.255
    
    1. 注意
      IP地址127.0.0.1~127.255.255.255用于回路测试,
      如:127.0.0.1可以代表本机IP地址,用http://127.0.0.1 就可以测试本机中配置的Web服务器。

    4. socket简介

    socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
    它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
    创建socket

    socket.socket(AddressFamily, Type)
    

    说明:
    函数 socket.socket 创建一个 socket,返回该 socket 的描述符,该函数带有两个参数:
    1 Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET
    2 Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

    import socket
    
    mdpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    

    创建Socket时,SOCK_DGRAM指定了这个Socket的类型是UDP

    5. udp网络程序-发送数据

    socket函数

    mySocket = socket(family, type)
    

    函数socket()的参数family用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。


    函数socket()的参数type用于设置套接字通信的类型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(数据包套接字)等。
    并不是所有的协议族都实现了这些协议类型,例如,AF_INET协议族就没有实现SOCK_SEQPACKET协议类型。


    做一个简单的服务端,绑定一个端口

    import socket
    
    udpSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    bindAdress =('',10086)
    udpSocket.bind(bindAdress)#绑定一个端口
    while True:
        recvDate,recvAddr = udpSocket.recvfrom(1024)#如果没有收到发往这个绑定端口的消息,会一直阻塞在这里
        recvMsg = '【Receive from %s : %s】:%s'%(recvAddr[0],recvAddr[1],recvDate.decode('gbk'))
        print(recvMsg)
    

    发消息的客户端

    import socket
    
    mySocket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    sendAddr=('192.168.11.67',10086)
    msg = input('>>')
    msg = msg.encode('gbk')
    mySocket.sendto(msg,sendAddr)
    mySocket.close()
    

    发送123到10086端口

    G:\tools\python3.5\python.exe E:/workspace/day26/01_socket.py
    >>123
    

    服务端收到消息

    G:\tools\python3.5\python.exe E:/workspace/day26/08_服务端绑定端口.py
    【Receive from 192.168.11.67 : 54658】:123
    
    

    6. udp网络通信过程

    Paste_Image.png

    7. 总结

    1. udp是TCP/IP协议族中的一种协议能够完成不同机器上的程序间的数据通信
    2. udp服务器、客户端
      udp的服务器和客户端的区分:往往是通过请求服务和提供服务来进行区分
      1.请求服务的一方称为:客户端
      2.提供服务的一方称为:服务器
    3. udp绑定问题
      一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程
      客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况

    相关文章

      网友评论

        本文标题:Python UDP编程

        本文链接:https://www.haomeiwen.com/subject/srrjqxtx.html