zoukankan      html  css  js  c++  java
  • TCP和UDP的区别以及使用python服务端客户端简单编程

    一、TCP、UDP区别总结

    1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

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

    3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性较高的通信或广播通信

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

    5、TCP对系统资源要求较多,UDP对系统资源要求较少

     

     二、TCP服务端以及客户端编程

    服务器端:

    from socket import *
    
    #创建套接字sockfd
    sockfd = socket() #默认参数可以创建tcp套接字
    
    #套接字绑定ip,端口
    sockfd.bind(('192.168.191.1',8888))
    
    #让套接字具有监听功能,创建监听队列
    sockfd.listen(5)
    
    
    while True:
        print("waiting for connect....")
        connfd,addr = sockfd.accept()  
        # accept函数主要用于服务器端,一般位于listen函数之后,默认会阻塞进程,
        # 直到有一个客户请求连接,建立好连接后,它返回的一个新的套接字connfd,以及客户的地址addr,
        # 此后,服务器端即可使用这个新的套接字connfd与该客户端进行通信,
        # 而sockfd则继续用于监听其他客户端的连接请求                                   
        print("connect from",addr)
        while True:
            data = connfd.recv(1024)  #收消息
            if not data:
                break
            print("客户端发来的消息:",data.decode())
            #发消息通过str.decode()编码
            
            connfd.send("服务端已收到消息!".encode()) #发消息
            #收消息通过str.encode()解码
            
        connfd.close()
    
    sockfd.close()
       

     

    客户端:

    from socket import *
    
    #创建套接字
    sockfd = socket()
    
    #发起连接
    sockfd.connect(('192.168.191.1',8888))
    
    while True:
        msg = input("发消息>>")
        #服务端那边是先收消息,所以客户端就先发
        #发消息
        sockfd.send(msg.encode())
        if not msg:
            break
        
        #收消息
        data = sockfd.recv(1024)
        print(data.decode())
        
    sockfd.close()
        

     

    三、UDP服务端以及客户端编程

    服务器端:

    from socket import * 
    import sys 
    from time import ctime 
    
    #这里使用了一个sys.agrv,从命令行传入IP和端口
    #格式:python3 udp_server.py 192.168.191.1 8888
    
    #如果输入格式不对,给一个提示信息
    if len(sys.argv) < 3:
        print('''
               argv is error!!!
               input as 
               python3 udp_server.py 192.168.191.1 8888
               ''')
    
    HOST = sys.argv[1]
    PORT = int(sys.argv[2])
    ADDR = (HOST,PORT)
    BUFFERSIZE = 1024
    
    #创建数据报套接字
    sockfd = socket(AF_INET,SOCK_DGRAM)
    #绑定地址
    sockfd.bind(ADDR)
    
    while True:
        #收消息
        data,addr = sockfd.recvfrom(BUFFERSIZE)
        #recvfrom()和recv()有点不同,recvfrom()返回的是接收到的消息和消息发送者的地址
        print('recv from %s:%s' %(addr,data.decode()))
        
        #发消息
        sockfd.sendto((" %s 接收到消息" %ctime()).encode(),addr)
        #sendto()和send()也有点不同,sendto()有两个参数,一个为发送的消息,另一个是发送给某个主机的地址
    
    sockfd.close()

     

    客户端:

    from socket import * 
    import sys 
    
    #从命令行传入IP和端口
    #python3 udp_server.py 192.168.191.1 8888
    if len(sys.argv) < 3:
        print('''
               argv is error!!!
               input as 
               python3 udp_server.py 192.168.191.1 8888
               ''')
    
    HOST = sys.argv[1]
    PORT = int(sys.argv[2])
    ADDR = (HOST,PORT)
    BUFFERSIZE = 1024
    
    #创建数据报套接字
    sockfd = socket(AF_INET,SOCK_DGRAM)
    
    while True:
        #发消息
        data = input("消息>>")
        if not data:
            break
        sockfd.sendto(data.encode(),ADDR)
        
        #收消息
        data,ADDR = sockfd.recvfrom(BUFFERSIZE)
        print('从服务器收到:',data.decode())
    sockfd.close()

     

    四、TCP和UDP编程步骤区别总结

    1、创建套接字

    TCP使用的是SOCK_STREAM(套接字类型:字节流),SOCK_STREAM这种的特点是面向连接的,即每次收发数据之前必须通过connect建立连接

    UDP使用的是SOCK_DGRAM(套接字类型:数据包),SOCK_DGRAM这种是User Datagram Protocol协议的网络通讯,它是无连接的,不可靠的

    2、TCP服务端使用listen开启监听以及accept阻塞进程来等待客户端连接(所以TCP对系统资源要求较多),UDP是面向无连接的则不需要

    3、收发消息

    TCP使用的是recv()接收消息,send()发送消息

    UDP使用的是recvfrom()循环接收数据,sendto()发送数据 

    *TCP一旦发生丢包,TCP将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大

     UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络造成的影响

  • 相关阅读:
    PS_0005:画带颜色在线条框 按住Alt键复制
    零钱兑换(动态规划)
    倒排索引原理和实现
    集群搭建
    java内部类
    nohup &后台运行脚本
    scala构造函数
    spark数据源读取及读数据原理
    安装redis解决公司linux环境的坑
    61、对于employees表中,给出奇数行的first_name
  • 原文地址:https://www.cnblogs.com/hooo-1102/p/10766949.html
Copyright © 2011-2022 走看看