美文网首页
day33-基于UDP的套接字通信

day33-基于UDP的套接字通信

作者: 天行_b6d0 | 来源:发表于2020-08-24 14:39 被阅读0次

    一、基于udp协议的套接字通信

    TCP VS UDP协议
    1、可靠性
    tcp协议是可靠协议:
    对方必须回复一个ack确认信息,才会将自己这端的数据从内存中删除

    udp协议不可靠:
    发送一条消息就会立即删除,不管对方是否接收到

    2、有无链接
    tcp有链接,udp无链接

    3、传输数据的效率
    udp更高

    4、粘包问题
    udp协议称之为数据报协议,每次发送都是一个完整的数据报,一个发送唯一对应一个接收
    所以udp协议没有粘包问题


    udp服务端

    from socket import *
    import time
    
    server = socket(AF_INET, SOCK_DGRAM)
    server.bind(('127.0.0.1', 8080))
    
    while True:
        data, client_addr = server.recvfrom(1024)
        time.sleep(10)
        server.sendto(data.upper(), client_addr)  # 这里默认是将接收的数据大写返回,也可以在定义返回信息
    
    

    udp客户端

    from socket import *
    
    client = socket(AF_INET, SOCK_DGRAM)
    
    while True:
        msg = input('>>: ').strip()
        client.sendto(msg.encode("utf-8"), ('127.0.0.1', 8080))
    
        data, server_addr = client.recvfrom(1024)
        print(data.decode('utf-8'))
    

    二、TCP基于socketserver模块实现并发

    服务端

    import socketserver
    
    
    class MyRequestHandler(socketserver.BaseRequestHandler):
        def handle(self):  # 处理通信
            print(self.client_address)
            while True:
                try:
                    data = self.request.recv(1024)  # self.request=>conn
                    if len(data) == 0: break
                    self.request.send(data.upper())  # 这里默认是将接收的数据大写返回,也可以在定义返回信息
    
                except Exception:
                    break
            self.request.close()
    
    
    if __name__ == '__main__':
        s = socketserver.ThreadingTCPServer(('127.0.0.1', 8080), MyRequestHandler, bind_and_activate=True)
        s.serve_forever()
    

    客户端

    from socket import *
    
    client=socket(AF_INET,SOCK_STREAM)
    client.connect(('127.0.0.1',8080))
    
    while True:
        msg=input(">>: ").strip()
        if len(msg) == 0:
            continue
    
        client.send(msg.encode('utf-8'))
        data=client.recv(1024)
        print(data.decode('utf-8'))
    

    三、UDP基于socketserver模块实现并发

    服务端

    import socketserver
    
    
    class MyRequestHandler(socketserver.BaseRequestHandler):
        def handle(self):  # 处理通信
            data,server=self.request
            server.sendto(data.upper(),self.client_address)  # 这里默认是将接收的数据大写返回,也可以在定义返回信息
    
    
    if __name__ == '__main__':
        s = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyRequestHandler, bind_and_activate=True)
        s.serve_forever()
    
    

    客户端

    from socket import *
    
    client = socket(AF_INET, SOCK_DGRAM)
    
    while True:
        msg = input('>>: ').strip()
        client.sendto(msg.encode("utf-8"), ('127.0.0.1', 8080))
    
        data, server_addr = client.recvfrom(1024)
        print(data.decode('utf-8'))
    
    

    相关文章

      网友评论

          本文标题:day33-基于UDP的套接字通信

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