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

  • 相关阅读:
    light oj 1105 规律
    light oj 1071 dp(吃金币升级版)
    light oj 1084 线性dp
    light oj 1079 01背包
    light oj 1068 数位dp
    light oj 1219 树上贪心
    light oj 1057 状压dp TSP
    light oj 1037 状压dp
    矩阵快速幂3 k*n铺方格
    矩阵快速幂2 3*n铺方格
  • 原文地址:https://www.cnblogs.com/hooo-1102/p/10766949.html
Copyright © 2011-2022 走看看