zoukankan      html  css  js  c++  java
  • 网络编程——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 客户端
  • 相关阅读:
    redis 持久化RDB、AOF
    进程、线程、协程
    nginx 常用配置
    Redis详解(一)
    Nginx(一)
    docker compose
    练习1——排序
    8万行的insert数据,Ctrl+c、Ctrl+v后心态崩了(如何在Linux下对MySQL数据库执行sql文件)
    Ubuntu使用+Thinkphp5学习——20(html文件中代码注释掉,但是runtime/temp中的php文件仍然存在)
    Ubuntu使用+Thinkphp5学习——19(新增用户报错strip_tags() expects parameter 1 to be string, array given)
  • 原文地址:https://www.cnblogs.com/king-home/p/10813847.html
Copyright © 2011-2022 走看看