• python基础-TCP协议和UDP协议


    TCP协议是一种流式协议,UDP协议是一种数据包协议。

    TCP和UDP是OSI模型中传输层的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。

    TCP和UDP区别总结:

    TCP UDP
    是否连接 面向连接 无连接
    传输可靠性 可靠 不可靠
    应用场合 少量数据 大量数据
    传输速度

    区别补充说明:

    1、TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付

    2、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

    3、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

    4、TCP首部开销20字节;UDP的首部开销小,只有8个字

    python编程步骤不同

    TCP编程的服务器端一般步骤是:

    import socket
    # 步骤二的参数
    from socket import SOL_SOCKET
    from socket import SO_REUSEADDR
    
    # TCP服务端
    # 1、创建socket对象,通过socket()获取
    server_socket = socket.socket()
    # 2、设置socket属性,导入参数,通过setsockopt() #该步骤可选
    server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    # 3、绑定IP地址、端口信息到socket对象中,通过bind(),参数是一个元组
    server_socket.bind(('127.0.0.1', 9527))
    # 4、开启半连接池,使用listen(),参数是整型,表示接收可等待的客户端
    server_socket.listen(5)
    while True:
        # 5、阻塞状态,自动接收客户端的连接,通过函数accept(),返回连接对象和客户端地址
        conn, client = server_socket.accept()
        while True:
            try:
                # 6、收发数据,通过recv() 接收数据,默认参数是1024,表示每次接收数据最大字节数为1024; 
                re_data = conn.recv(1024).decode('utf-8')
                # 获取到空数据后,重新收发数据
                if len(re_data) == 0:
                    continue
                # 获取到q后,关闭连接
                if re_data == 'q':
                    break
                print(re_data)
                # send()发送数据,数据必须是bytes类型
                msg = input("from server……").strip().encode('utf-8')
                conn.send(msg)
            except ConnectionResetError as e:
                print(e)
        # 7、关闭连接
        conn.close()
        # 8、关闭连接池
        server_socket.close()
    

    TCP编程的客户端一般步骤是:

    import socket
    # 步骤二的参数
    from socket import SOL_SOCKET
    from socket import SO_REUSEADDR
    
    # TCP客户端
    # 1、创建socket对象,通过socket()获取
    client_socket = socket.socket()
    # 2、设置socket属性,导入参数,通过setsockopt() #该步骤可选
    client_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    # 3、设置要连接的服务端的IP地址和端口属性并连接到服务端,通过connect()
    # 参数为元组,元组中第一个元素是IP地址,第二个元素是端口号
    client_socket.connect(('127.0.0.1', 9527))
    while True:
        # 4、通过send()发送数据,数据必须是bytes类型
        msg = input('from client……').strip().encode('utf-8')
        client_socket.send(msg)
        # 5、通过recv() 接收数据,默认参数是1024,表示每次接收数据最大字节数为1024;
        re_data = client_socket.recv(1024).decode('utf-8')
        if re_data == 'q':
            break
        print(re_data)
    # 6、关闭网络连接
    client_socket.close()
    

    UDP编程的服务端一般步骤是:

    import socket
    # 步骤二的参数
    from socket import SOL_SOCKET
    from socket import SO_REUSEADDR
    
    # UDP服务端
    # 1、获取socket对象,type=-1或者1 表示socket的类型默认为SOCK_STREAM ---→ TCP
    # type = 2表示socket的类型为SOCK_DGRAM  ----→ UDP
    server = socket.socket(type=2)
    # 2、设置socket属性,导入参数,通过setsockopt() #该步骤可选
    server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    # 3、绑定服务器地址和端口
    server.bind(('127.0.0.1', 9527))
    # 4、循环收发数据
    while True:
        # 自动阻塞,等待客户端访问,接收客户端发送数据,接收使用recvfrom()
        # 收到的记录是一个元组,分别是数据和地址
        data, addr = server.recvfrom(1024)
        re_data = data.decode('utf-8')
        if len(re_data) == 0:
            continue
        if re_data == 'q':
            break
        # 打印收到的结果
        print(f'client_addr:{addr},re_data:{re_data}')
        # 输入发送给client的记录
        msg = input('from Server to Client:').strip().encode('utf-8')
        # 发送消息使用sendto,参数是二进制数据和地址
        server.sendto(msg, addr)
    # 5、关闭网络连接
    server.close()
    

    UDP编程的客户端一般步骤是:

    import socket
    # 步骤二的参数
    from socket import SOL_SOCKET
    from socket import SO_REUSEADDR
    
    # UDP服务端
    # 1、获取socket对象,type=-1或者1 表示socket的类型默认为SOCK_STREAM ---→ TCP
    # type = 2表示socket的类型为SOCK_DGRAM  ----→ UDP
    client = socket.socket(type=2)
    # 2、设置socket属性,导入参数,通过setsockopt() #该步骤可选
    client.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    server_add = '127.0.0.1'  # 服务端地址
    # 3、循环收发数据
    while True:
        # 发送数据使用sendto(),参数是二进制数据和地址
        msg = input('from_udp_client……').strip().encode('utf-8')
        client.sendto(msg, (server_add, 9527))
        # 接收数据使用recvfrom()
        re_data, addr = client.recvfrom(1024)
        if re_data.decode('utf-8') == 'q':
            break
        print(re_data.decode('utf-8'))
    # 4、关闭连接
    client.close()
    
  • 相关阅读:
    MFC 记录 CreateProcess启动外部游戏主程序
    MFC 记录 CListCtrl 学习使用
    MS SQL自定义字符串拆分函数的惨痛经历
    C#路径/文件/目录/I/O常见操作汇总
    2012年开发者该做的11件事
    取出AD中一個組的所有成員信息(C#實現功能配合EXT做的界面)
    代码注释规范
    基于工作实际需求的Ext.Net和C#搭配应用之一 取出网域(AD)中所有计算机名及位置描述等信息
    2012,我的C#全能Excel操作(无需Office,不使用XML)
    一個文件文件和路徑的類
  • 原文地址:https://www.cnblogs.com/xiaodan1040/p/11997285.html
Copyright © 2020-2023  润新知