• Python进阶 网路编程


    预备知识:

    每个ip地址都包含两个内容:网络地址和主机地址

      1、ipv4(ip的version4,第四版本的ip),256*256*256*256种网址(最小0和最大255不能用)。

      2、ipv6(ip的version6,第六版本的ip),由于ipv4的ip地址已经被全部使用,所以使用ipv6版本。

    端口:知名端口、动态端口

      1、Linux系统有65536(2的16次方)个端口,端口号:0~65535

      2、知名端口(0-1023):改端口默认该端口分配给特定的服务。如:80-HTTP服务,21-FTP服务

      3、动态端口(1024-65535)

    Python 网络编程

    0、TCP协议和UDP协议

        

    1、模块socket中的socket类的实例套接字-服务器套接字、客户端套接字

    描述:

      套接字是模块socket中的socket类的实例,基本上是一个信息通道,两端各有一个程序。网络上不同的电脑可以通过套接字传递信息。

    语法:  

      1、实例化套接字可以指定三个参数:

        1、一个地址族(默认:socket.AF_INET)

        2、默认-流套接字(socket.SOCK_STREAM)或者数据报套接字(socket.SOCK_DGRAM)

        3、协议

      2、服务器套接字建立服务器套接字,将在某个网络地址(IP和端口号组成)监听,如果有客户端套接字与该网络地址连接-s.connect(host,port)准备随时处理一个或多个客户端的连接。

        调用方法bind,将服务器套接字绑定到指定的地址和串口

        调用方法listen,指定待办任务长度,即最多多少个连接在队列等待接纳

        进行无限循环,并调用方法accept,等待并随时处理客户端连接

          while True:

            C,addr = s.accept()   # 将套接字标识符保存至c,c与客户端套接字建立连接,c可以调用方法send和recv实现服务器套接字和客户端套接字传输数据。

      3、客户端套接字只需要连接,完成任务可断开连接

        调用方法bind,将客户端套接字绑定到指定的地址和串口;如果不调用,则使用临时串口!!!         

        调用方法connect,将客户端套接字与指定网络地址(IP和端口号组成)的服务器套接字相连接

        调用方法send和recv,实现服务器套接字和客户端套接字传输数据   

    2、防火墙设置

      防火墙不是阻止的服务器套接字的创建,而是阻止来自网络的数据包入站,新建入站规则

    3、模块urllib和urllib2

      模块urllib和urllib2的功能类似,但是urllib2可以实现HTTP身份验证或者Cookie和编写拓展来处理自己的协议。

      urllib提供了一系列用于操作URL的功能。

      url(统一资源定位符),对可以从互联网上得到的资源的位置访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

      urllib功能:

        1、打开远程文件,调用模块urllib.request中的函数urlopen创建类似于文件对象webpage,该对象支持方法:read、close、readline、readlines和迭代

    from urllib.request import urlopen
    webpage = urlopen('https://home.cnblogs.com/u/yinminbo')

        2、函数:urlretrieve,调用此函数可以返回一个格式为(filename,headers)的元组,

    from urllib.request import  urlretrieve
    urlretrieve('https://home.cnblogs.com/u/yinminbo', 'H:\webpage.html')
    

    4、SocketServer即相关的类

    描述:

      SocketServer包含4个基本的服务器:TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer

      标准库提供的服务器框架包括:BaseHTTPServer、SimpleHTTPServer,CGIHTTPServer、SimpleXMLRPCServer、DocXMLRPCServer等服务器。模块SocketServer是服务器框架的基石。因为BaseHTTPServer等服务器是在基本服务器的基础上添加了各种功能。

    语法:

    实例:基于SocketServer的极简服务器

    from socketserver import TCPServer, StreamRequestHandler
    
    
    class Handle(StreamRequestHandler):
        def handle(self):
            addr = self.request.getpeername()
            print('information from: ', addr)
            self.wfile.write('thank you for connecting')
    
    
    server = TCPServer(('', 1234), Handle)
    server.serve_forever()

    5、多个连接

      处理多个连接的主要方式:分叉、线程化、异步I/O。模块SocketServer中的混合类和服务器类,容易实现分叉和线程化

      分叉的缺点:由于每个分叉出来的子进程都必须有自己的内存空间,所欲占用的资源较多,而且在客户端很多时伸缩性不佳,所以分叉适用于客户端数量适中的情况。

      线程化的缺点:线程化是轻量级进程(子进程),都位于同一个进程中并共享内存,所以减少资源占用,但是由于共享内存,所以需要确保各个子进程不会彼此干扰或同时修改同一项数据,带来同步问题!

    语法:

      分叉服务器

    from socketserver import TCPServer, StreamRequestHandler, ForkingMixIn
    
    
    class Server(ForkingMixIn, TCPServer):
        pass
        
    
    class Handle(StreamRequestHandler):
        def handle(self):
            addr = self.request.getpeername()
            print('information from: ', addr)
            self.wfile.write('thank you for connecting')
    
    
    server = TCPServer(('', 1234), Handle)
    server.serve_forever()

      线程化服务器

    from socketserver import TCPServer, StreamRequestHandler,ThreadingMixIn
    
    
    class Server(ThreadingMixIn, TCPServer):
        pass
    
    
    class Handle(StreamRequestHandler):
        def handle(self):
            addr = self.request.getpeername()
            print('information from: ', addr)
            self.wfile.write('thank you for connecting')
    
    
    server = TCPServer(('', 1234), Handle)
    server.serve_forever()

      select异步I/O

    import socket,select
     
    s=socket.socket()
     
    host=socket.gethostname()
    port=1234
    s.bind((host,port))
    s.listen(5)
    inputs=[s]
    while True:
        rs,ws,es=select.select(inputs,[],[])
        for r in rs:
            if r is s:
                c,addr=s.accept()
                print(b'Got connection from',addr)
                inputs.append(c)
        else:
            try:
                data=r.recv(1024)
                disconnected=not data
            except socket.error:
                disconnected=True
     
            if disconnected:
                print(r.getpeername(),b'disconnected')
                inputs.remove(r)
            else:
                print(data)

     

     

  • 相关阅读:
    IO流
    简单JSON
    开发流程
    命名规范
    策略模式
    Git的使用
    Markdown的使用
    代理模式
    装饰者模式
    POJ 2976 3111(二分-最大化平均值)
  • 原文地址:https://www.cnblogs.com/yinminbo/p/11365583.html
Copyright © 2020-2023  润新知