python网络编程

pyton语言在网络编程中的应用比较广泛。socket模块可以实现网络设备之间的通信;HTTP库可以实现网站服务器与浏览器之前的通信;urllib库可以处理客户端的请求和服务器端的响应,还可以解析URL地址;ftplib模块可以实现文件的上传和下载;电子邮件服务器模块可以实现邮件的发送和接收;telnetlib模块可以连接远程计算机。

网络

OSI是Open System Interconnection的缩写,意为开放式系统互联。国际标准化组织(ISO)制定了OSI模型,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本框架。OSI模型把网络通信的工作分为7层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
OSI模型的设计目的是成为一个所有销售商都能实现的开放网路模型,来克服使用众多私有网络模型所带来的困难和低效性。OSI是在一个备受尊敬的国际标准团体的参与下完成的,这个组织就是ISO(国际标准化组织)。什么是OSI,OSI是Open System Interconnection 的缩写,意为开放式系统互联参考模型。在OSI出现之前,计算机网络中存在众多的体系结构,其中以IBM公司的SNA(Systems Network Architecture,系统网络体系结构)和DEC公司的DNA(Digital Network Architecture,数字网络体系结构)最为著名。为了解决不同体系结构的网络的互联问题,国际标准化组织ISO(注意不要与OSI搞混)于1981年制定了开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM)。这个模型把网络通信的工作分为7层,它们由低到高分别是物理层(Physical Layer),数据链路层(Data Link Layer),网络层(Network Layer),传输层(Transport Layer),会话层(Session Layer),表示层(Presentation Layer)和应用层(Application Layer)。第一层到第三层属于OSI参考模型的低三层,负责创建网络通信连接的链路;第五层到第七层为OSI参考模型的高三层,具体负责端到端的数据通信;第四层负责高低层的连接。每层完成一定的功能,每层都直接为其上层提供服务,并且所有层次都互相支持,而网络通信则可以自上而下(在发送端)或者自下而上(在接收端)双向进行。当然并不是每一通信都需要经过OSI的全部七层,有的甚至只需要双方对应的某一层即可。物理接口之间的转接,以及中继器与中继器之间的连接就只需在物理层中进行即可;而路由器与路由器之间的连接则只需经过网络层以下的三层即可。总的来说,双方的通信是在对等层次上进行的,不能在不对称层次上进行通信。

OSI分层原则

网络中各结点都有相同的层次

不同结点相同层次具有相同的功能

同一结点相邻层间通过接口通信

每一层可以使用下层提供的服务,并向上层提供服务

不同结点的同等层间通过协议来实现对等层间的通信

OSIOSI/RM分层

对等层通信的实质:

对等层实体之间虚拟通信;下层向上层提供服务;实际通信在最底层完成;发送方数据由最高层逐渐向下层传递,到接收方数据由最低层逐渐向高层传递。

协议数据单元PDU

OSI参考模型中,对等层协议之间交换的信息单元统称为协议数据单元(PDU,Protocol Data Unit)。

而传输层及以下各层的PDU另外还有各自特定的名称:

传输层——数据段(Segment)

网络层——分组(数据包)(Packet)

数据链路层——数据帧(Frame)

物理层——比特(Bit)

物理层(Physical Layer)

物理层是OSI分层结构体系中最重要、最基础的一层,它建立在传输媒介基础上,起建立、维护和取消物理连接作用,实现设备之间的物理接口。物理层之接收和发送一串比特(bit)流,不考虑信息的意义和信息结构。

物理层包括对连接到网络上的设备描述其各种机械的、电气的、功能的规定。具体地讲,机械特性规定了网络连接时所需接插件的规格尺寸、引脚数量和排列情况等;电气特性规定了在物理连接上传输bit流时线路上信号电平的大小、阻抗匹配、传输速率距离限制等;功能特性是指对各个信号先分配确切的信号含义,即定义了DTE(数据终端设备)和DCE(数据通信设备)之间各个线路的功能;过程特性定义了利用信号线进行bit流传输的一组操作规程,是指在物理连接的建立、维护、交换信息时,DTE和DCE双方在各电路上的动作系列。物理层的数据单位是位。

属于物理层定义的典型规范代表包括:EIA/TIARS-232、EIA/TIARS-449、V.35、RJ-45等。

物理层的主要功能:

·为数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成。一次完整的数据传输,包括激活物理连接,传送数据,终止物理连接。所谓激活,就是不管有多少物理媒体参与,都要在通信的两个数据终端设备间连接起来,形成一条通路。

·传输数据。物理层要形成适合数据传输需要的实体,为数据传送服务:

一、保证数据按位传输的正确性;

二、向数据链路层提供一个透明的位传输;

三、提供足够的带宽(带宽是指每秒钟内能通过的比特(BIT)数),以减少信道上的拥塞。传输数据的方式能满足点到点,一点到多点,串行或并行,半双工或全双工,同步或异步传输的需要。

完成物理层的一些管理工作,如在数据终端设备、数据通信和交换设备等设备之间完成对数据链路的建立、保持和拆除操作。

物理层的典型设备:光纤、同轴电缆、双绞线、中继器和集线器

在物理层提供比特流服务的基础上,将比特信息封装成数据帧Frame,起到在物理层上建立、撤销、标识逻辑链接和链路复用以及差错校验等功能。通过使用接收系统的硬件地址或物理地址来寻址。建立相邻结点之间的数据链路,通过差错控制提供数据帧(Frame)在信道上无差错的传输,同时为其上面的网络层提供有效的服务。

数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。

在这一层,数据的单位称为帧(frame)。

数据链路层协议的代表包括:SDLC、HDLC、PPP、STP、帧中继等。

链路层的主要功能:

·链路层的功能是实现系统实体间二进制信息块的正确传输

·为网络层提供可靠无错误的数据信息

·在数据链路中解决信息模式、操作模式、差错控制、流量控制、信息交换过程和通信控制规程的问题

链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。链路层应具备如下功能:

·链路连接的建立,拆除,分离。

·帧定界和帧同步。链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界。

·顺序控制,指对帧的收发顺序的控制。

·差错检测和恢复。还有链路标识,流量控制等等。差错检测多用方阵码校验和循环码校验来检测信道上数据的误码,而帧丢失等用序号检测。各种错误的恢复则常靠反馈重发技术来完成。

数据链路层的典型设备:二层交换机、网桥、网卡

网络层(Network Layer)

网络层也称通信子网层,是高层协议之间的界面层,用于控制通信子网的操作,是通信子网与资源子网的接口。在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点,确保数据及时传送。网络层将解封装数据链路层收到的帧,提取数据包,包中封装有网络层包头,其中含有逻辑地址信息源站点和目的站点地址的网络地址。

如果你在谈论一个IP地址,那么你是在处理第3层的问题,这是“数据包”问题,而不是第2层的“帧”。IP是第3层问题的一部分,此外还有一些路由协议和地址解析协议(ARP)。有关路由的一切事情都在第3层处理。地址解析和路由是3层的重要目的。网络层还可以实现拥塞控制、网际互连、信息包顺序控制及网络记账等功能。

在网络层交换的数据单元的单位是分割和重新组合数据包(packet)。

网络层协议的代表包括:IP、IPX、OSPF等。

网络层主要功能是基于网络层地址(IP地址)进行不同网络系统间的路径选择。

网络层主要功能

网络层为建立网络连接和为上层提供服务,应具备以下主要功能:

·路由选择和中继;

·激活,终止网络连接;

·在一条数据链路上复用多条网络连接,多采取分时复用技术;

·差错检测与恢复;

·排序,流量控制;

·服务选择;

·网络管理;

网络层典型设备:网关、路由器

传输层(Transport Layer)

传输层建立在网络层和会话层之间,实质上它是网络体系结构中高低层之间衔接的一个接口层。用一个寻址机制来标识一个特定的应用程序(端口号)。传输层不仅是一个单独的结构层,它还是整个分层体系协议的核心,没有传输层整个分层协议就没有意义。

传输层的数据单元是由数据组织成的数据段(segment)这个层负责获取全部信息,因此,它必须跟踪数据单元碎片、乱序到达的数据包和其它在传输过程中可能发生的危险。

传输层获得下层提供的服务包括:

·发送和接收正确的数据块分组序列,并用其构成传输层数据;

·获得网络层地址,包括虚拟信道和逻辑信道。

传输层向上层提供的服务包括:

·无差错的有序的报文收发;

·提供传输连接;

·进行流量控制。

传输层为上层提供端到端(最终用户到最终用户)的透明的、可靠的数据传输服务,所谓透明的传输是指在通信过程中传输层对上层屏蔽了通信传输系统的具体细节。

传输层协议的代表包括:TCP、UDP、SPX等。

传输层主要功能

传输层的主要功能是从会话层接收数据,根据需要把数据切成较小的数据片,并把数据传送给网络层,确保数据片正确到达网络层,从而实现两层数据的透明传送。

传输层是两台计算机经过网络进行数据通信时,第一个端到端的层次,具有缓冲作用。当网络层服务质量不能满足要求时,它将服务加以提高,以满足高层的要求;当网络层服务质量较好时,它只用很少的工作。传输层还可进行复用,即在一个网络连接上创建多个逻辑连接。

传输层也称为运输层。传输层只存在于端开放系统中,是介于低三层通信子网系统和高三层之间的一层,但是很重要的一层。因为它是源端到目的端对数据传送进行控制从低到高的最后一层。

有一个既存事实,即世界上各种通信子网在性能上存在着很大差异。例如电话交换网、分组交换网、公用数据交换网、局域网等通信子网都可互连,但它们提供的吞吐量、传输速率、数据延迟通信费用各不相同。对于会话层来说,却要求有一性能恒定的界面。传输层就承担了这一功能。它采用分流/合流、复用/介复用技术来调节上述通信子网的差异,使会话层感受不到。

此外传输层还要具备差错恢复、流量控制等功能,以此对会话层屏蔽通信子网在这些方面的细节与差异。传输层面对的数据对象已不是网络地址和主机地址,而是和会话层的界面端口。上述功能的最终目的是为会话提供可靠的、无误的数据传输。传输层的服务一般要经历传输连接建立阶段、数据传送阶段、传输连接释放阶段3个阶段才算完成一个完整的服务过程。而在数据传送阶段又分为一般数据传送和加速数据传送两种。传输层服务分成5种类型。基本可以满足对传送质量、传送速度、传送费用的各种不同需要。

会话层(Session Layer)

这一层也可以称为会晤层或对话层,在会话层及以上的高层次中,数据传送的单位不再另外命名,统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的。

会话层提供的服务可使应用建立和维持会话,并能使会话获得同步。会话层使用校验点可使通信会话在通信失效时从校验点继续恢复通信。这种能力对于传送大的文件极为重要。会话层、表示层、应用层构成开放系统的高3层,面对应用进程提供分布处理,对话管理,信息表示,恢复最后的差错等。会话层同样要担负应用进程服务要求,而运输层不能完成的那部分工作,给运输层功能差距以弥补。主要的功能是对话管理,数据流同步和重新同步。要完成这些功能,需要由大量的服务单元功能组合,已经制定的功能单元已有几十种。

会话层的主要功能

·会话层连接到传输层的映射;

·会话连接的流量控制;

·数据传输;

·会话连接恢复与释放;

·会话连接管理、差错控制。

为会话实体间建立连接、为给两个对等会话服务用户建立一个会话连接,应该做如下几项工作:

·将会话地址映射为运输地址;

·选择需要的运输服务质量参数(QOS);

·对会话参数进行协商;

·识别各个会话连接;

·传送有限的透明用户数据;

·数据传输阶段。

这个阶段是在两个会话用户之间实现有组织的,同步的数据传输。用户数据单元为SSDU,而协议数据单元为SPDU。会话用户之间的数据传送过程是将SSDU转变成SPDU进行的。

连接释放

连接释放是通过”有序释放”、”废弃”、”有限量透明用户数据传送”等功能单元来释放会话连接的。会话层标准为了使会话连接建立阶段能进行功能协商,也为了便于其它国际标准参考和引用,定义了12种功能单元。各个系统可根据自身情况和需要,以核心功能服务单元为基础,选配其他功能单元组成合理的会话服务子集。会话层的主要标准有”DIS8236:会话服务定义”和”DIS8237:会话协议规范”。

表示层(Presentation Layer)

表示层向上对应用层提供服务,向下接收来自会话层的服务。表示层是为在应用过程之间传送的信息提供表示方法的服务,它关心的只是发出信息的语法与语义。表示层要完成某些特定的功能,主要有不同数据编码格式的转换,提供数据压缩、解压缩服务,对数据进行加密、解密。例如图像格式的显示,就是由位于表示层的协议来支持。

表示层为应用层提供服务包括语法选择、语法转换等。语法选择是提供一种初始语法和以后修改这种选择的手段。语法转换涉及代码转换和字符集的转换、数据格式的修改以及对数据结构操作的适配。

应用层(Application Layer)

网络应用层是通信用户之间的窗口,为用户提供网络管理、文件传输、事务处理等服务。其中包含了若干个独立的、用户通用的服务协议模块。网络应用层是OSI的最高层,为网络用户之间的通信提供专用的程序。应用层的内容主要取决于用户的各自需要,这一层设计的主要问题是分布数据库、分布计算技术、网络操作系统和分布操作系统、远程文件传输、电子邮件、终端电话及远程作业登录与控制等。至2011年应用层在国际上没有完整的标准,是一个范围很广的研究领域。在OSI的7个层次中,应用层是最复杂的,所包含的应用层协议也最多,有些还在研究和开发之中。

应用层为操作系统或网络应用程序提供访问网络服务的接口。

应用层协议的代表包括:Telnet、FTP、HTTP、SNMP、DNS等。

通过 OSI 层,信息可以从一台计算机的软件应用程序传输到另一台的应用程序上。例如,计算机 A 上的应用程序要将信息发送到计算机 B 的应用程序,则计算机 A 中的应用程序需要将信息先发送到其应用层(第七层),然后此层将信息发送到表示层(第六层),表示层将数据转送到会话层(第五层),如此继续,直至物理层(第一层)。在物理层,数据被放置在物理网络媒介中并被发送至计算机 B 。计算机 B 的物理层接收来自物理媒介的数据,然后将信息向上发送至数据链路层(第二层),数据链路层再转送给网络层,依次继续直到信息到达计算机 B 的应用层。最后,计算机 B 的应用层再将信息传送给应用程序接收端,从而完成通信过程。

OSI 的七层运用各种各样的控制信息来和其他计算机系统的对应层进行通信。这些控制信息包含特殊的请求和说明,它们在对应的 OSI 层间进行交换。每一层数据的头和尾是两个携带控制信息的基本形式。

对于从上一层传送下来的数据,附加在前面的控制信息称为头,附加在后面的控制信息称为尾。然而,在对来自上一层数据增加协议头和协议尾,对一个 OSI 层来说并不是必需的。

当数据在各层间传送时,每一层都可以在数据上增加头和尾,而这些数据已经包含了上一层增加的头和尾。协议头包含了有关层与层间的通信信息。头、尾以及数据是相关联的概念,它们取决于分析信息单元的协议层。例如,传输层头包含了只有传输层可以看到的信息,传输层下面的其他层只将此头作为数据的一部分传递。对于网络层,一个信息单元由第三层的头和数据组成。对于数据链路层,经网络层向下传递的所有信息即第三层头和数据都被看作是数据。换句话说,在给定的某一 OSI 层,信息单元的数据部分包含来自于所有上层的头和尾以及数据,这称之为封装。

例如,如果计算机 A 要将应用程序中的某数据发送至计算机 B ,数据首先传送至应用层。 计算机 A 的应用层通过在数据上添加协议头来和计算机 B 的应用层通信。所形成的信息单元包含协议头、数据、可能还有协议尾,被发送至表示层,表示层再添加为计算机 B 的表示层所理解的控制信息的协议头。信息单元的大小随着每一层协议头和协议尾的添加而增加,这些协议头和协议尾包含了计算机 B 的对应层要使用的控制信息。在物理层,整个信息单元通过网络介质传输。

计算机 B 中的物理层收到信息单元并将其传送至数据链路层;然后 B 中的数据链路层读取计算机 A 的数据链路层添加的协议头中的控制信息;然后去除协议头和协议尾,剩余部分被传送至网络层。每一层执行相同的动作:从对应层读取协议头和协议尾,并去除,再将剩余信息发送至上一层。应用层执行完这些动作后,数据就被传送至计算机 B 中的应用程序,这些数据和计算机 A 的应用程序所发送的完全相同 。

一个 OSI 层与另一层之间的通信是利用第二层提供的服务完成的。相邻层提供的服务帮助一 OSI 层与另一计算机系统的对应层进行通信。一个 OSI 模型的特定层通常是与另外三个 OSI 层联系:与之直接相邻的上一层和下一层,还有目标联网计算机系统的对应层。例如,计算机 A 的数据链路层应与其网络层,物理层以及计算机 B 的数据链路层进行通信。

网络的连接有两种类型:以连接为导向和以包为导向

socket模块

socket由一些对象组成,这些对象提供网络应用程序的跨平台标准。

认识socket模块

socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或应答网络请求,使主机间或一台计算机上的进程可以通信。socket模块提供了标准的网络接口,可以访问底层操作系统socket接口的全部方法。

Python使用socket()函数创建套接字,其语法格式如下:

socket.socket([family[, type[,protocol]]])

各个参数的含义如下:

(1)family:套接字中的网络协议,包括AF_UNTX(UNTX网域协议)或AF_INET(IPv4网域协议,如TCP与UDP)。
(2)type:套接字类型,包括SOCK_STREAM(使用在TCP协议)、SOCK_DGRAM(使用在UDP协议)、SOCK_RAW(使用在IP协议)和SOCK_SEQPACKET(列表连接模式)。
(3)protocol:只使用在family等于AF_INET或type等于SOCK_RAW的时候。protocol是一个常数,用于辨识所使用的协议种类。默认值是0,表示适用于所有的socket类型。

创建socket连接

下面使用socket模块的socket函数创建一个socket对象。socket对象可以通过调用其他函数设置一个socket服务。通过调用bind(hostname,port)函数指定服务的port(端口),然后调用socket对象的accept方法,该方法等待客户端的连接并返回connection对象,表示已连接到该客户端。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#创建服务器端的socket服务
# 导入 socket、sys 模块
import socket
import sys

# 创建 socket 对象
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

port = 9999

# 绑定端口
serversocket.bind((host, port))

# 设置最大连接数,超过后排队
serversocket.listen(5)

while True:
# 建立客户端连接
clientsocket,addr = serversocket.accept()

print("连接地址: %s" % str(addr))

msg='莫使金樽空对月,还须怜取眼前人'+ "\r\n"
clientsocket.send(msg.encode('utf-8'))
clientsocket.close()

保存并运行程序,即可在服务器端启动socket服务。

下面演示如何创建一个客户端,并连接到以上服务,端口号为12345。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#创建客户端的连接

# 导入 socket、sys 模块
import socket
import sys

# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取本地主机名
host = socket.gethostname()

# 设置端口号
port = 9999

# 连接服务,指定主机和端口
s.connect((host, port))

# 接收小于 1024 字节的数据
msg = s.recv(1024)

s.close()

print (msg.decode('utf-8'))

保存并运行程序。

HTTP库

HTTP是一个客户端到服务器端的请求和应答的标准。客户端是终端用户,服务器端是网站。客户端发起一个到服务器上指定端口的HTTP请求,服务器向客户端发回一个状态行和响应的消息。
可以使用下面的模块创建Internet Server。
(1)socketserver:以socket为基础,一般性的IP Server。
(2)http:通过http模块中的子模块server和client提供各种网络服务。

socketserver模块

socketserver模块提供一个架构,来简化网络服务器的编写工作。用户不需要使用低级的socket模块,socketserver模块提供四个基本的server类:TCPServer,UDPServer,StreamRequestHandler以及DatagramRequestHandler。这些类处理同步的要求,每一个请求都必须在下一个请求开始前完成。但是如果是客户端需要长时间的计算,这些类就不适合。

为了通过线程程来处理要求,可以使用下列类:ThreadingTCPServer,ThreadingUDPServer,ForkingTCPServer以及ForkingUDPServer。

(1)TCPServer((hostname,port),handler):支持TCP协议的服务器。其中,hostname是主机名称,通常是空白字符串;port是通信端口号;handler是BaseRequestHandler类的实例变量。
(2)UDPServer((hostname,port),handler):支持UDP协议的服务器。其中,hostname是主机名称,通常是空白字符串;port是通信端口号;handler是BaseRequestHandler类的实例变量。

server模块

http模块的子模块server提供各种HTTP服务。主要包括BaseHTTPServer类、CGIHTTPServer类与SimpleHTTPServer类。
server模块定义两个基类,来操作基本的HTTP服务器(也称为网站服务器)。此模块以socketserver模块为基础,并且很少直接使用。
server模块的第一个基类是HTTPServer类,其语法为:
class HTTPServer((hostname, port), RequestHandlerClass)
HTTPServer类由socketserver.TCPServer类派生。此类创建一个HTTPServer对象,并且监听(hostname, port),然后使用RequestHandlerClass来处理要求。

client模块

client模块主要处理客户端的请求。client模块的HTTPConnection类创建并且返回一个connection对象。HTTPConnection类的语法如下:
class HTTPConnection ([hostname [, port]])
如果没有设置参数port,默认值是80。如果所有的参数都没有设置,必须使用connect()方法来自行连接。
使用HTTPConnection类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import http.client

#指定主机名称
url = "www.python.org"
#指定打开的文件名称
urlfile = "/News.html"

#连接到主机
host = http.client.HTTPConnection (url)

#写入客户端要求表头的第一行
host.request("GET", urlfile)
#获取服务器的响应
r1=host.getresponse()
#打印服务器返回的状态
print(r1.status,r1.reason)
#将file对象的内容存入新文件
file = open("D:\\python\\ch14\\14.1.html", "w")
#读取网页内容,以utf-8方式保存
str = r1.read().decode("utf-8")
#寻找文本
print(str.find("mlive"))
#写到文件并替换 'xa0' 为空字符
file.write(str.replace('\xa0',''))
#关闭文件
file.close()

urllib库

urllib库可以处理客户端的请求和服务器端的响应,还可以解析URL地址,常用的模块有request和parse。

request模块

request模块是使用socket来读取网络数据的接口,支持HTTP,FTP,以及gopher等连接。
要读取一个网页文件,可以使用urlopen()方法。语法如下:
urllib.request.urlopen(url [, data])
其中参数url是一个URL字符串;参数data用来指定一个GET请求。
urlopen()方法返回一个stream对象,可以用file对象的方法来操作此stream对象。

下面用urlopen方法抓取网页文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

import urllib.request
#打开网页文件
htmlhandler = urllib.request.urlopen("http://www.baidu.com")

#在本机上创建一个新文件
file = open("C:\\python\\2.html", "wb")

#将网页文件存储到本机文件上,每次读取512个字节
while 1:
data = htmlhandler.read(512)
if not data:
break
file.write(data)

#关闭本机文件
file.close()
#关闭网页文件
htmlhandler.close()

parse模块

parse模块解析URL字符串,并且返回一个元组:(addressing scheme, netword location, path, parameters, query, fragment identifier)。parse模块可以将URL分解成数个部分,然后再组合回来,并且可以将相对地址转换成绝对地址。

FTP模块

FTP(File Transfer Protocol)是一种在网络上传输文件的普遍方式,因为在大部分的操作系统上都有客户端的FTP与服务器端的FTP服务。服务器端的FTP可以同时使用在私有(private)的用户,与匿名(anonymous)的用户。
私有的服务器端FTP只允许系统用户来连接,匿名的服务器端FTP则允许不需帐号即可以连接网络来传输文件。使用匿名的服务器端FTP,会产生安全性的问题。
FTP提供一个控制端口与一个数据端口,在服务器端与客户端之间的数据传输使用独立的socket,以避免死机的问题。
Python中默认安装的ftplib模块定义了FTP类,可用来创建一个FTP连接,用于上传或下载文件。FTP类的语法如下所示:
class FTP([host [, user [, passwd [, acct]]]])
其中host是主机名称,user是用户帐号,passwd是用户密码。

上传FTP文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

from ftplib import FTP

ftp = FTP()
timeout = 30
port = 21
# 连接FTP服务器
ftp.connect('192.168.1.106',port,timeout)
# 登录FTP服务器
ftp.login('adminns','123456')
# 获得欢迎信息
print (ftp.getwelcome())
ftp.cwd('file/test') # 设置FTP路径
list = ftp.nlst() # 获得目录列表
# 打印文件名字
for name in list:
print(name)
# 文件保存路径
path = 'd:/data/' + name
# 打开要保存文件
f = open(path,'wb')
# 保存FTP文件
filename = 'RETR ' + name
# 保存FTP上的文件
ftp.retrbinary(filename,f.write)
# 删除FTP文件
ftp.delete(name)
# 上传FTP文件
ftp.storbinary('STOR '+filename, open(path, 'rb'))
# 退出FTP服务器
ftp.quit()

电子邮件服务协议

SMPT协议与POP3协议提供电子邮件服务。SMPT是网络上传输电子邮件的标准,定义应用程序如何在网络上交换电子邮件。SMPT协议负责将电子邮件放在电子邮箱内。若要从电子邮箱内取出电子邮件,则需要POP3协议。POP3负责从网络客户端读取邮件,并指定由监督武器如何传输电子邮件。POP3协议的目的是存取远程的外部服务器。

smptlib模块

Python的smptlib模块提供SMTP协议的客户端接口,用来传输电子邮件到网络上的其他机器。
smptlib模块定义一个SMTP类,用来创建一个SMTP连接。SMTP类的语法如下所示:
class SMTP([host [, port]])
其中参数host是主机名称。下列是SMTP类的实例变量的方法列表:
⑴ connect(host [, port]):连接到(host, port),port的默认值是25。
⑵ sendmail(from_addr, to_addrs, msg [, mail_options, rcpt_options]):送出电子邮件。from_addr是RFC 822 from-address字符串,to_addr是RFC 822 to-address字符串。msg是一个信息字符串。
⑶ quit():结束SMTP连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

import smtplib

#指定SMTP服务器
host = "smtp.163.com"

#寄件者的电子邮件信箱
sender = " chengcai@163.com "

#收件者的电子邮件信箱
receipt = " sanduo@163.com "

#电子邮件的内容
msg = """
您好:
这是一个测试的电子邮件
"""

#创建SMTP类的实例变量
myServer = smtplib.SMTP(host)

#寄出电子邮件
myServer.sendmail(sender, receipt, msg)

#关闭连接
myServer.quit()

poplib模块

Python的poplib模块提供POP3协议的客户端接口,用来从网络上接收电子邮件。
poplib模块定义一个POP3类,用来创建一个POP3连接。POP3类的语法如下所示:
class POP3([host [, port]])
其中host是主机名称,port的默认值是110。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

import poplib, string

#指定POP服务器
host = "saturn.seed.net.tw"

#创建一个POP3类的实例变量
myServer = poplib.POP3(host)

#返回POP3服务器送出的欢迎字符串
print (myServer.getwelcome())

#输入电子邮件的帐号
myServer.user("johnny")
#输入电子邮件的密码
myServer.pass_("123456")

#返回信息列表
r, items, octets = myServer.list()

#读取最后一个信息
msgid, size = string.split(items[-1])

#返回最后一个信息号码的内容
r, msg, octets = myServer.retr(msgid)
msg = string.join(msg, "\n")

#打印后一个信息号码的内容
print (msg)

imaplib模块

Python的imaplib模块提供IMAP协议的客户端接口。imaplib模块定义一个IMAP4类,用来创建一个IMAP连接。IMAP4类的语法如下所示:
class IMAP4([host [, port]])
其中host是主机名称,port的默认值是163。
下列是IMAP4类的实例变量的方法列表:
⑴ fetch(message_set, message_parts):取出信息。
⑵ login(user, password):登录IMAP4服务器。
⑶ logout():注销IMAP4服务器,关闭连接。
⑷ search(charset, criterium [, …]):搜索邮件信箱找出符合的信息。
⑸ select([mailbox [, readonly]]):选择一个邮件信箱。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

import imaplib, getpass, string
host = "imap.dummy.com"
user = "jonny"
pwd = getpass.getpass()
msgserver = imaplib.IMAP4(host)
msgserver.login(user, pwd)
msgserver.select()
msgtyp, msgitems = msgserver.search(None, "ALL")
for idx in string.split(msgitems[0]):
msgtyp, msgitems = msgserver.fetch(idx, "(RFC822)")
print ("Message %s\n" % num)
print ("---------------\n")
print ("Content: %s" % msgitems[0][1])
msgserver.logout()

nntp模块

nntplib模块提供客户端的NNTP协议的接口,NNTP(Network News Transfer Protocol)是一个提供新闻群组(newsgroup)的服务。NNTP协议使用ASCII文字,在客户端与服务器端之间传输数据,同时也用来交换服务器间的新闻稿。
nntplib模块定义一个NNTP类,用来创建一个NNTP连接。NNTP类的语法如下所示:
class NNTP(host [, port [, user [, password [, readermode]]]])
其中host是主机名称,port的默认值是119。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

import nntplib
import string

#指定NNTP服务器
host = "news.microsoft.com"

#指定新闻群组
group = "microsoft.public.java.activex"

#输入要搜索的关键词
keyword = raw_input("Enter keyword to search: ")

#连结到NNTP服务器
myServer = nntplib.NNTP(host)

#送出一个"GROUP"命令
r, count, first, last, name = myServer.group(group)

#返回所有的新闻稿
r, messages = myServer.xover(first, last)

#读取新闻稿的内容
for id, subject, author, date, msgid, refer, size, lines in messages:

#找到新闻稿中的主题有要搜索的关键词
if string.find(subject, keyword) >= 0:

#读取id号码的新闻稿
r, id, msgid, msgbody = myServer.article(id)

#打印该新闻稿的作者,主题,与日期
print ("Author: %s - Subject: %s - Date: %s\n" % (author, subject, date))

#打印该新闻稿的内容
print ("<-Begin Message->\n")
print (msgbody)
print ("<-End Message->\n")

telnetlib模块

telnetlib模块提供客户端的Telnet协议的服务,Telnet协议用来连接远程的计算机,通常使用通信端口23。创建好Telnet连接后,就可以通过Telnet接口在远程的计算机上执行命令。
telnetlib模块定义一个Telnet类,用来创建一个Telnet连接。Telnet类的语法规则如下所示:
class Telnet([host [, port]])
其中host是主机名称,port的默认值是23。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

import telnetlib

#指定Telnet服务器
host = "http://www.dummy.com"

#指定用户帐号
username = "johnny" + "\n"
#指定用户密码
password = "123456" + "\n"

#创建Telnet类的实例变量
telnet = telnetlib.Telnet(host)

#登入Telnet服务器,输入用户帐号与密码
telnet.read_until("login: ")
telnet.write(username)
telnet.read_until("Password: ")
telnet.write(password)

#输入命令
while 1:
command = raw_input("[shell]: ")
telnet.write(command)
if command == "exit":
break
telnet.read_all()
-------------本文结束感谢您的阅读-------------