zoukankan      html  css  js  c++  java
  • UDP协议

    1. udp协议

    # *****************udp服务端****************
    # 基础版本
    import socket
    # udp
    server = socket.socket(type=socket.SOCK_DGRAM)
    
    server.bind(('127.0.0.1',8000))
    # udp不要建立连接,直接发
    # 需不需要监听?
    # 跟tcp的不是一样的
    # data = server.recvfrom(1024)
    data,addr = server.recvfrom(1024)
    # data 是个元组,第一个参数是数据部分,第二个参数是客户端地址
    print(data)
    server.sendto(data.upper(),addr)
    
    
    # 加入通信循环
    import socket
    # udp
    server = socket.socket(type=socket.SOCK_DGRAM)
    
    server.bind(('127.0.0.1',8000))
    
    while True:
        data,addr = server.recvfrom(1024)
        print(data)
        server.sendto(data.upper(),addr)
        
    # *****************udp客户端****************
    # 基础版本
    import socket
    # udp
    client = socket.socket(type=socket.SOCK_DGRAM)
    
    # 直接发
    client.sendto(b'lqz',('127.0.0.1',8000))
    data = client.recvfrom(1024)
    print(data)
    
    # 加入通信循环
    import socket
    # udp
    client = socket.socket(type=socket.SOCK_DGRAM)
    
    while True:
        msg = input('请输入要发送的数据:')
        # 直接发
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8000))
        data = client.recvfrom(1024)
        print(data)
    
    

    2. udp协议是否粘包

    # *****************udp服务端****************
    # udp 协议没有粘包问题(udp协议又叫数据报协议),可以发空,tcp不行
    import socket
    server = socket.socket(type=socket.SOCK_DGRAM)
    
    server.bind(('127.0.0.1',8000))
    while True:
        data,addr = server.recvfrom(1024)
        print(data)
        server.sendto(data.upper(),addr)
    
    data,addr = server.recvfrom(1024)
    print(data)
    data,addr = server.recvfrom(1024)
    print(data)
    data,addr = server.recvfrom(1024)
    print(data)
    data,addr = server.recvfrom(1024)
    print(data)
    
    
    
    # *****************udp客户端****************
    import socket
    
    client = socket.socket(type=socket.SOCK_DGRAM)
    
    while True:
        msg = input('>>>:')
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8000))
        data = client.recvfrom(1024)
        print(data)
    
    client.sendto('lqz'.encode('utf-8'),('127.0.0.1',8000))
    client.sendto('hello'.encode('utf-8'),('127.0.0.1',8000))
    client.sendto('world'.encode('utf-8'),('127.0.0.1',8000))
    client.sendto(''.encode('utf-8'),('127.0.0.1',8000))
    
    
    # ***********udp客户端丢包****************
    import socket
    # udp 不会管客户端或者服务端是否收到,它只管发,所以不可靠
    
    client = socket.socket(type=socket.SOCK_DGRAM)
    
    while True:
        msg = input('>>>:')
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8000))
        data = client.recvfrom(1024)
        print(data)
    
    
    # udp特点
        # 可以发空(数据报协议,自带头)
        # 客户端和服务端可以有一方没在线(因为不需要建立连接)
    

    3. socketserver模块udp

    # **************socketserver服务端************
    # 使用socketsever写服务端
    # 导入模块
    
    import socketserver
    
    # 自己定义一个类,必须继承BaseRequestHandler
    class MyTcp(socketserver.BaseRequestHandler):
        # 必须重写handle方法
        def handle(self):
            print(self)
            # 数据
            print(self.request[0])
            print(self.request[1])
            print(type(self.request[1]))
            self.request[1].sendto('xxxx'.encode('utf-8'),self.client_address)
            try:
                while True:  # 通信循环
                    data = self.request.recvfrom(1024)
                    print(data)
            except Exception:
                pass
    
    if __name__ == '__main__':
        # 实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
        server = socketserver.ThreadingUDPServer(('127.0.0.1', 8000), MyTcp)
        # 一直在监听
        # 这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
        server.serve_forever()
        
    # **************client_通信循环**************
    import socket
    # udp
    client = socket.socket(type=socket.SOCK_DGRAM)
    
    client.sendto('lqz'.encode('utf-8'),('127.0.0.1',8000))
    client.sendto('hello'.encode('utf-8'),('127.0.0.1',8000))
    client.sendto('world'.encode('utf-8'),('127.0.0.1',8000))
    client.sendto(''.encode('utf-8'),('127.0.0.1',8000))
    data = client.recvfrom(1024)
    print(data)
    
    

    4. socketserver模块

    # **************socketsever服务端*************
    # 使用socketserver写服务端
    # 导入模块
    import socketserver
    
    # 自己定义一个类,必须继承BaseRequestHandler
    class MyTcp(socketserver.BaseRequestHandler):
        # 必须重写handle方法
        def handle(self):
            try:
                while True:  # 通信循环
                    print(self)
                    # 给客户端回消息
                    # conn对象就是request
                    # 接收数据
                    print(self.client_address)
                    data = self.request.recv(1024)
                    print(data)
                    if len(data) == 0:
                        return
                    # 发送数据
                    self.request.send(data.upper())
            except Exception:
                pass
    
    if __name__ == '__main__':
        # 实例化得到一个tcp连接的对象,Threading意思是说,只要来了请求,它自动的开线程来处理连接跟交互数据
        server = socketserver.ThreadingTCPServer(('127.0.0.1',8001),MyTcp)
        # 一直在监听
        # 这么理解:只要来一个请求,就起一个线程(造一个人,做交互)
        server.serve_forever()
        
    # *************client_通信循环**************
    import socket
    
    soc = socket.socket()
    soc.connect(('127.0.0.1',8001))
    while True:
        soc.send('xxxx'.encode('utf-8'))
        print(soc.recv(1024))
    
    
  • 相关阅读:
    MySQL 中无法 insert 文件路径 中的 backward slash的解决方法
    生成颜色代码的 Java程序
    公积金贷款不受影响 组合贷款有特殊
    ADOMD.NET Client Object架构
    心情•笔记20061231
    微软所谓的"无人工介入的自动的机器翻译系统"
    游戏中的微软
    商业智能的个人理解
    无日
    从电影死亡笔记看商业智能在治安领域的应用
  • 原文地址:https://www.cnblogs.com/yushan1/p/11494618.html
Copyright © 2011-2022 走看看