• Server socket


    用法都一样

    区别:  self.request  

      TCP  self.requsst 代表具体的链接

      UDP  self.requst 代表一个小元组(元组里面: 第一个元素 客户端发来的数据 ,第二个元素  回复客户端的套接字对象)

    基于UDP:

    import socketserver
    from threading import current_thread
    # fork linux下一个多进程接口 windows没有这接口
    # 用于处理请求的类
    
    class MyHandler(socketserver.BaseRequestHandler):
        def handle(self):
            print(self)
            print(self.server)  # 获取封装的服务器对象
            print(self.client_address)# 客户端地址
            print(self.request)# 是一个元祖 包含收到的数据 和服务器端的socket
            # data,client = self.request
    
            data = self.request[0]
            print(data.decode("utf-8"))
            self.request[1].sendto(b"i am server",self.client_address)
    
    server = socketserver.ThreadingUDPServer(("127.0.0.1",9999),MyHandler)
    server.serve_forever()
    
    
    
    # ThreadingUDPServer  在初始化的时候创建了socket对象
    # serve_forever() 将sockt注册到select(多路复用的)
    # select中返回一个ready  如果为True则可以处理 _handle_request_noblock   内部创建了一个MyHandler的示例  调用了handler函数
    
    #  使用了socket  OOP  多线程
    
    # 正常开发中 如果并发量不大 就是用socketserver
    # 否则用协程
    
    
    
    
    
    """
    使用时的区别:
    ThreadingTCPServer
        handler 在连接成功时执行
        self.request 是客户端的socket对象  
        
    ThreadingUDPServer
        handler 接收到数据时执行
        self.request  数据和服务器端的socket对象 
    
    
    """
    server
    #基于TCP 客户端
    import socket
    c  =  socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    addr = (('127.0.0.1',2020))
    # c.connect(addr)
    while True:
        msg = input('>>>: ')
        c.sendto(msg.encode('utf-8'),addr)
    
        print(c.recvfrom(1024)[0].decode('utf-8'))
    client

    基于TCP:

    import socketserver
    from threading import current_thread
    # fork linux下一个多进程接口 windows没有这接口
    
    # 用于处理请求的类
    class MyHandler(socketserver.BaseRequestHandler):
        def handle(self):
            print(self)
            print(self.server)  # 获取封装的服务器对象
            print(self.client_address)# 客户端地址
            print(self.request)# 获取客户端的socket对象
            print(current_thread())
            while True:
                data = self.request.recv(1024)
                print(data.decode("utf-8"))
                self.request.send(data.upper())
    
    
    server = socketserver.ThreadingTCPServer(("127.0.0.1",9999),MyHandler)
    server.serve_forever()
    server
    #基于TCP 客户端
    import socket
    c  =  socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    addr = (('127.0.0.1',2020))
    c.connect(addr)
    while True:
        msg = input('>>>: ')
        c.send(msg.encode('utf-8'))
    
        print(c.recv(1024).decode('utf-8'))
    client
  • 相关阅读:
    Can't initialize physical volume "/dev/sdb" of volume group "cinder-volumes" without -ff /dev/sdb: physical volume not initialized.
    openstack核心组件--neutron网络服务2(4)
    openstack部署cinder
    [转载]数字证书原理,公钥私钥加密原理
    [转载]签名、加密、证书的基本原理和理解
    [转载]各种加密算法比较
    [转载]对称加密DES和TripleDES
    [转载]oracle的加密和解密
    PLSQL 问题小记
    [转载]Java中的String,StringBuilder,StringBuffer三者的区别
  • 原文地址:https://www.cnblogs.com/TF511/p/9965741.html
Copyright © 2020-2023  润新知