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)

 

 

 

 

 

 

posted @ 2019-12-09 19:14  石斛  阅读(248)  评论(0编辑  收藏  举报