zoukankan      html  css  js  c++  java
  • 第一阶段:Python开发基础 day34 网络编程之sockerserver详细讲解

    一、基于socket的udp

    #计算机的计量单位
    # int类型的能表示的范围:2的7次方-1
    # 2的8次方
    # 1 个小格是一个比特位
    #8个小格8个比特位是一个字节 1b
    #1024个字节是1kb
    #1024kb是1mb
    #1024mb是g
    
    
    import socket
    
    soc = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
    soc.bind(('127.0.0.1',8009))
    data,addr=soc.recvfrom()
    soc.sendto('sss'.encode('uft-8'),addr)
    '''
    #特点:
        -不需要建立连接,不需要确认
        -数据报协议:可以传空
    '''
    

    二、基于socket的udp

    import socketserver
    
    class Mytcp(socketserver.BaseRequestHandler):
        def handle(self):
            pass
    
    if __name__ == '__main__':
        #得到一个对象
        server=socketserver.ThreadingTCPServer(('127.0.0.1',8008),Mytcp)
        server.serve_forever()
    
    
    
     #udp服务端
    # import socketserver
    #
    # class Mytcp(socketserver.BaseRequestHandler):
    #     def handle(self):
    #         pass
    #
    # if __name__ == '__main__':
    #     #得到一个对象
    #     server=socketserver.ThreadingUDPServer(('127.0.0.1',8008),Mytcp)
    #     server.serve_forever()
    

    三、socketserver源码分析

    import socketserver
    
    class MyTcp(socketserver.BaseRequestHandler):
        def handle(self):
            # self.server  ThreadingTCPServer的对象:
            # self.request   conn
            #self.client_address   addr
            pass
    
    
    if __name__ == '__main__':
        server=socketserver.ThreadingTCPServer(('127.0.0.1',8001),MyTcp)
        # server=socketserver.ThreadingUDPServer(('127.0.0.1',8001),MyTcp)
        '''
            1 ThreadingTCPServer实例化:走__init__方法
                -ThreadingTCPServer(ThreadingMixIn, TCPServer)的__init__方法,没有,走的父类:TCPServer(BaseServer)的__init__
                -TCPServer(BaseServer)的__init__又调用了父类的__init__
                    -赋值操作:self.server_address = server_address
                              self.RequestHandlerClass = RequestHandlerClass
                    -数据放到谁当中了?放到了server这个对象中
                -socket.bind()
                -socker.listen()
            2  server.serve_forever()   
                -一堆代码不需要要管:self._handle_request_noblock
                    -request, client_address = self.get_request()
                        -self.get_request()在Tcpserver这个类: self.socket.accept()
                    - self.process_request(request, client_address):ThreadingMixIn类的process_request
                        -开启线程执行ThreadingMixIn类的process_request_thread,执行了finish_request(request, client_address, self) 在 BaseServer 类中
                            -request :就是咱的连接对象,conn
                            -client_address 客户端ip和端口
                            -self:server对象,实例化得到的server对象
                            -实例化RequestHandlerClass得到一个对象:会走__init__方法
                            -RequestHandlerClass没有,走的BaseRequestHandler类的__init__
                            -会执行handle方法,通信逻辑
        '''
        server.serve_forever()
    

    四、网络编程汇总

    '''
    网络是什么:链接介质+协议
    协议:osi7层
    5层协议:
        -物理层   01000101010
        -数据链路层:做分组:数据报/数据帧   mac
        -网络层:ip   通过ip得到mac地址---arp协议   mac地址学习
        -传输层:tcp/udp   三次握手四次挥手,可靠传输
        -应用层:写的程序都是应用层,基于socket(基于网络和传输抽象出来的)/http协议/邮件
    
    socket编写tcp的客户端和服务端:
        -传输文件:自己定制了协议
        -粘包问题终极解决方案
            -struct模块先把头的长度包成四个字节,发送四个字节
            -发送头
            -发送内容
            -接收端:
                -接收4个字节,解除头部长度
                -接收头部,取出数据长度
                -接收数据长度
    
    
    socket编写udp的客户端和服务端
        -不需要建立连接,传输不可靠,数据报协议(自己有头)
    
    socketserver写支持并发的服务端
    
    '''
    #with 上下文管理器
    # with open('a.avi','rb') as f:
    #     for line in f:
    #         print(line)
    
    class Open():
        def __enter__(self):
            print('xxxxx')
            pass
        def __exit__(self, exc_type, exc_val, exc_tb):
            print('yyyyy')
            pass
    
    with Open() as f:
        #代码
        f.name='xxx'
    
  • 相关阅读:
    linux文件权限查看及修改(实用)
    将JSON对象带有格式的写出到文件中
    mySQL数据库Sql语句执行效率检查--Explain命令
    mysql优化
    Linux-设置固定IP
    logback 配置详解(二)——appender
    logback 配置详解(一)——logger、root
    Thread
    Singleton
    多线程编程总结
  • 原文地址:https://www.cnblogs.com/foreversun92/p/11528433.html
Copyright © 2011-2022 走看看