zoukankan      html  css  js  c++  java
  • python网络编程之UDP方式传输数据

    UDP --- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议。

    UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。

    由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

    开发环境:linux下pycharm3.5 

    测试:使用terminal终端测试

    使用 nc -u ip 端口 进行测试客户端

    使用 nc -lu ip 端口 进行测试服务器端

    1.udp服务器端接受一次数据

    import socket
    
    # 设置服务器默认端口号
    PORT = 9002
    # 创建一个套接字socket对象,用于进行通讯
    # socket.AF_INET 指明使用INET地址集,进行网间通讯
    # socket.SOCK_DGRAM 指明使用数据协议,即使用传输层的udp协议
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    address = ("", PORT)
    # 为服务器绑定一个固定的地址,ip和端口
    server_socket.bind(address)
    # 接收客户端传来的数据 recvfrom接收客户端的数据,默认是阻塞的,直到有客户端传来数据
    # recvfrom 参数的意义,表示最大能接收多少数据,单位是字节
    # recvfrom返回值说明
    # receive_data表示接受到的传来的数据,是bytes类型, receive_data.decode()解码,将bytes类型转换为字符串类型
    # client_address 表示传来数据的客户端的身份信息,客户端的ip和端口,元组
    receive_data, client = server_socket.recvfrom(1024)
    
    print("来自客户端%s,发送的%s" % (client, receive_data.decode()))
    # 不再接收数据的时候,将套接字socket关闭
    server_socket.close()

    测试:

    2.udp服务端循环多次接受数据

    import socket
    
    PORT = 9002
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    address = ("192.168.219.129", PORT)
    server_socket.bind(address)
    while True:
        receive_data, client_address = server_socket.recvfrom(1024)
        print("接收到了客户端 %s 传来的数据: %s" % (client_address, receive_data.decode()))

    3.udp客户端接受一次数据

    import socket
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    msg = input("请输入要发送的内容:")  # 字符串类型, 通过msg.encode() 编码 转换为bytes类型
    server_address = ("127.0.0.1", 8000)  # 接收方 服务器的ip地址和端口号
    client_socket.sendto(msg.encode(), server_address)
    client_socket.close()

    4.udp客户端循环多次接受数据

    import socket
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    while True:
        msg = input("请输入要发送的内容:")   
        server_address = ("192.168.79.127", 8000)  
        client_socket.sendto(msg.encode(), server_address)

    5.udp服务器端循环多次接受发送数据

    import socket
    
    PORT = 8000
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    address = ("", PORT)
    server_socket.bind(address)
    while True:
        receive_data, client_address = server_socket.recvfrom(1024)
        print("接收到了客户端 %s 传来的数据: %s" % (client_address, receive_data.decode()))
        server_socket.sendto(receive_data, client_address)

    6.udp客户端循环多次接受发送数据

    import socket
    
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    
    while True:
        msg = input("请输入要发送的内容:")
        server_address = ("", 8000) 
        client_socket.sendto(msg.encode(), server_address)
    
        receive_data, sender_address = client_socket.recvfrom(1024)
        print("接受到了发送方 %s 传来的数据: %s" % (sender_address, receive_data.decode()))
  • 相关阅读:
    拉格朗日插值
    [数论] hdu 5974 A Simple Math Problem (数论gcd)
    混合图欧拉回路
    上下界网络流
    HDU 6623 Minimal Power of Prime(数学)
    图的连通度
    最小点权覆盖和最大点权独立集
    最大权闭合子图(最小割,蕴含式最大获利问题)
    CodeForces Goodbye 2017
    网络流建模汇总
  • 原文地址:https://www.cnblogs.com/greatfish/p/7368433.html
Copyright © 2011-2022 走看看