• 网络编程——UDP协议,SocketServer模块介绍


    一、UDP 数据报协议
    特点:
    ①客户端允许发空————默认有报头
    ②协议不会粘包
    ③在服务端不存在的情况下,客户端不会报错
    ④udp 协议支持并发效果
    注:udp在启动服务之后,只能被动等待客户端发消息,客户端发送消息是需要带上服务端地址
           同理,在服务端回消息是也要带上客户端地址
    示例:

    import socket
    
    server = socket.socket(type=socket.SOCK_DGRAM)
    server.bind(('127.0.0.1', 8080))
    
    msg, addr = server.recvfrom(1024)
    print(msg.decode('utf-8'))
    server.sendto(b'hello', addr)
    
    server.close()
    服务端
    import socket
    
    client = socket.socket(type=socket.SOCK_DGRAM)
    server_addr = ('127.0.0.1', 8080)
    
    client.sendto(b'hello server baby!', server_addr)
    msg, addr = client.recvfrom(1024)
    print(msg, addr)
    客户端

    总结:

    TCP协议就类似于打电话
    
    UDP 协议就类似于发短信

    二、SocketServer模块介绍(让tcp也能支持并发)
    1、基于tcp协议的SocketServer:

    import socketserver
    
    
    class MyBaby(socketserver.BaseRequestHandler):
        def handle(self):
            # 通信循环
            while True:
                # self.request相当于你的conn通信对象
                data,sock = self.request # 收消息
                print(data)
                sock.sendto(data.upper(),self.client_address)  # self.client_address客户端地址
    
    
    if __name__ == '__main__':
        server = socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyBaby)
        server.serve_forever()
    TCP 服务端
    import socket
    
    client = socket.socket()
    client.connect(('127.0.0.1',8080))
    
    while True:
        client.send(b'hello')
        data = client.recv(1024)
        print(data)
    
    TCP 客户端

    2、基于udp协议的SocketServer:

    import socketserver
    
    
    class MyBaby(socketserver.BaseRequestHandler):
        def handle(self):
            # 通信循环
            while True:
                # self.request相当于你的conn通信对象
                data,sock = self.request # 收消息
                print(data)
                sock.sendto(data.upper(),self.client_address)  # self.client_address客户端地址
    UDP 服务端
    import socket
    import time
    
    client = socket.socket(type=socket.SOCK_DGRAM)
    sever_addr = ('127.0.0.1',8080)
    
    while True:
        client.sendto(b'hello',sever_addr)
        data,addr = client.recvfrom(1024)
        print(data,addr)
        time.sleep(1)
    UDP 客户端
  • 相关阅读:
    luogu P2852 [USACO06DEC]Milk Patterns G
    FZOJ 4267 树上统计
    CF1303G Sum of Prefix Sums
    luogu P5311 [Ynoi2011]成都七中
    luogu P5306 [COCI2019] Transport
    SP34096 DIVCNTK
    luogu P5325 【模板】Min_25筛
    luogu P1742 最小圆覆盖
    求两直线交点坐标
    1098: 复合函数求值(函数专题)
  • 原文地址:https://www.cnblogs.com/king-home/p/10813847.html
Copyright © 2020-2023  润新知