预备知识:
每个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)