第一阶段: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'
posted @ 2019-09-16 17:18  foreversun92  阅读(228)  评论(0编辑  收藏  举报