Python程序设计第11章 网络编程课件.pptx

上传人:小飞机 文档编号:1935526 上传时间:2022-12-27 格式:PPTX 页数:63 大小:662.45KB
返回 下载 相关 举报
Python程序设计第11章 网络编程课件.pptx_第1页
第1页 / 共63页
Python程序设计第11章 网络编程课件.pptx_第2页
第2页 / 共63页
Python程序设计第11章 网络编程课件.pptx_第3页
第3页 / 共63页
Python程序设计第11章 网络编程课件.pptx_第4页
第4页 / 共63页
Python程序设计第11章 网络编程课件.pptx_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《Python程序设计第11章 网络编程课件.pptx》由会员分享,可在线阅读,更多相关《Python程序设计第11章 网络编程课件.pptx(63页珍藏版)》请在三一办公上搜索。

1、2022/12/27,第11章 网络编程,主 讲 人:,目录,2022/12/27,2,1. 网络编程,2. 因特网应用层客户端,3. Python网络编程实例,2022/12/27,1.网络编程,本节将简要介绍使用套接字进行网络编程的知识。在此之前,将介绍一些有关网络编程的背景信息,以及套接字如何应用于Python之中,然后展示如何使用Python的相关网络编程模块来创建网络应用程序。,2022/12/27,1.1 客户端/服务器架构,什么是客户端服务器架构?,1.网络编程,2022/12/27,1.2套接字,1.网络编程,分为两种类型:基于文件(AF_UNIX)的和面向网络的(AF_INE

2、T)主机-端口对:,合法的端口号范围为065535。其中,小于1024的端口号为系统保留端口。,HOST=127.0.0.1 PORT=8888 BUFSIZ=1024 ADDR=(HOST,PORT),2022/12/27,1.2.1面向连接的套接字(TCP),1.网络编程, 服务器端程序创建套接字(socket)。将套接字绑定到一个本地地址和端口上(bind)。将套接字设为监听模式,准备接受客户请求(listen)。等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。用返回的套接字和客户端进行通信(send/recv)。返回,等待另一客户的请求

3、。关闭套接字。,2022/12/27,1.2.1面向连接的套接字(TCP),1.网络编程, 客户端程序创建套接字(socket)。向服务器发出连接请求(connect)。和服务器端进行通信(send/recv)。关闭套接字。,2022/12/27,1.2.2面向无连接的套接字(UDP),1.网络编程, 服务器端程序创建套接字(socket)。将套接字绑定到一个本地地址和端口上(bind)。等待接收数据(recvfrom)。关闭套接字。 客户端程序创建套接字(socket)。向服务器发送数据(sendto)。关闭套接字。,2022/12/27,1.3.1Python中socket模块函数,1.网

4、络编程,(1)服务器端(server),创建socket对象。调用socket构造函数。如: socket = socket.socket(family,type)将socket绑定到指定地址。这是通过socket对象的bind方法来实现的: socket.bind(address),2022/12/27,1.网络编程,(1)服务器端(server),使用socket套接字的listen方法接收连接请求: socket.listen(backlog)服务器套接字通过socket的accept方法等待客户请求一个连接。 connection,address = socket.accept(),1

5、.3.1Python中socket模块函数,2022/12/27,1.网络编程,(1)服务器端(server),处理阶段,服务器和客户端通过send和recv方法通信(传输数据)传输结束,服务器调用socket的close方法关闭连接。,1.3.1Python中socket模块函数,2022/12/27,1.网络编程,(2)客户端(client),创建一个socket以连接服务器: socket = socket.socket( family, type )使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:socket.connect( (host,port

6、) ),1.3.1Python中socket模块函数,2022/12/27,1.网络编程,(2)客户端(client),处理阶段,客户和服务器将通过send方法和recv方法通信。传输结束,客户通过调用socket的close方法关闭连接。,1.3.1Python中socket模块函数,2022/12/27,1.3.2套接字对象内置方法,1.网络编程,2022/12/27,1.3.3 创建TCP服务器,1.网络编程,伪代码:ss = socket()ss.bind()ss.listen()inf_loop:cs = ss.accept()comm_loop:cs.recv()/cs.send(

7、)cs.close()ss.close(),1.3.3 创建TCP服务器,1.网络编程,1 #!/usr/bin/env python 2 3 from socket import * 4 from time import ctime 5 6 HOST= 7 PORT=8888 8 BUFSIZ=1024 9 ADDR=(HOST,PORT)10 11 tcpSerSock=socket(AF_INET,SOCK_STREAM)12 tcpSerSock.bind(ADDR)13 tcpSerSock.listen(5)14 15 while True:16 print(waiting for

8、 connection.)17 tcpCliSock,addr=tcpSerSock.accept()18 print(.connected from:,addr)19 20 while True:21 data=tcpCliSock.recv(BUFSIZ)22 if not data:23 break24 print(data)25 tcpCliSock.send(%s %s %(ctime(),data)2627tcpCliSock.close()28 tcpSerSock.close(),2022/12/27,1.3.4 创建TCP客户端,1.网络编程,伪代码:cs = socket(

9、)sc.connect()comm_loop:cs.send()/cs.recv()cs.close(),2022/12/27,1.3.4 创建TCP客户端,1.网络编程,1 #!/usr/bin/env python 2 3 from socket import * 4 5 HOST=127.0.0.1 6 PORT=8888 7 BUFSIZ=1024 8 ADDR=(HOST,PORT) 9 10 tcpCliSock=socket(AF_INET,SOCK_STREAM)11 tcpCliSock.connect(ADDR)12 13 while True:14 data=input(

10、 )15 if not data:16 break17 tcpCliSock.send(data)18 data=tcpCliSock.recv(BUFSIZ)19 if not data:20 break21 print(data)22 23 tcpCliSock.close(),2022/12/27,1.3.4 运行结果,1.网络编程,现在,我们给出客户端对应的输入和输出,它以一个未带输入数据的简单Return(或Enter)键结束。$ python /usr/tcpClie.py helloThu Sep 1 15:35:45 2016 hello howareyouThu Sep 1

11、15:36:09 2016 howareyou,2022/12/27,1.3.4 运行结果,1.网络编程,服务器的输出主要是诊断性的。$ python /usr/tcpServ.pywaiting for connection.(.connected from:, (127.0.0.1, 48426)hellohowareyouwaiting for connection.,2022/12/27,1.3.5 创建UDP服务器,1.网络编程,UDP服务器不需要TCP服务器那么多的设置,因为它不是面向连接的。除了等待传入的连接以外,几乎不需要其他工作。ss.= socket()ss.bind()i

12、nf_loop:cs = ss.recvfrom()/ss.sendto()ss.close(),2022/12/27,1.3.5 创建UDP服务器,1.网络编程,1 #!/usr/bin/env python 2 3 from socket import * 4 from time import * 5 6 HOST= 7 PORT=8888 8 BUFSIZ=1024 9 ADDR=(HOST,PORT)10 11 udpSerSock=socket(AF_INET,SOCK_DGRAM)12 udpSerSock.bind(ADDR)13 14 while True:15 print(w

13、aiting for message.)16 data,addr=udpSerSock.recvfrom(BUFSIZ)17 if not data:18 break19 print(data)20 udpSerSock.sendto(%s %s %(ctime(),data),addr)21print(.received from and returned to:,addr)22 23 udpSerSock.close(),2022/12/27,1.3.6 创建UDP客户端,1.网络编程,在本节中所强调的4个客户端中,UDP客户端的代码是最短的。它的伪代码如下所示:cs = socket()

14、somm_loop:cs.sendto/cs.recvfrom()cs.close()一旦创建了套接字对象,就进入了对话循环之中,在这里我们与服务器交换消息。最后,当通信结束时,就会关闭套接字。,2022/12/27,1.3.6 创建UDP客户端,1.网络编程,1 #!/usr/bin/env python 2 3 from socket import * 4 5 HOST=localhost 6 PORT=8888 7 BUFSIZ=1024 8 ADDR=(HOST,PORT) 9 10 udpCliSock=socket(AF_INET,SOCK_DGRAM)11 12 while Tr

15、ue:13 data=input( )14 if not data:15 break16 udpCliSock.sendto(data,ADDR)17 data,ADDR=udpCliSock.recvfrom(BUFSIZ)18 if not data:19 break20 print(data)21 22 udpCliSock.close(),2022/12/27,1.3.6 运行结果,1.网络编程,$python /usr/tsUclnt.py HelloThu Sep 1 17:45:36 2016 Hello WorldThu Sep 1 17:45:50 2016 World服务器

16、的输出主要是诊断性的:$ python /usr/tsUserv.pywaiting for message.received from and returned to: (127.0.0.1, 48375)waiting for message.,2022/12/27,1.3.7 socket模块属性,1.网络编程,2022/12/27,1.4 socketserver模块,1.网络编程,socketserver是标准库中的一个高级模块,它的目标是简化很多样板代码,它们是创建网络客户端和服务器客户端所必需的代码。,2022/12/27,1.4 socketserver模块,1.网络编程,创建

17、socketserver TCP服务器(1)socketserver TCP服务器示例首先导入服务器类,然后定义与之前相同的主机常量。其次是请求处理程序类,最后启动它。更多的细节请查看下面的代码。,2022/12/27,1.4 socketserver模块,1.网络编程,1 #!/usr/bin/env python 2 3 from socketserver import (TCPServer as TCP,StreamRequestHandler as SRH) 4 from time import ctime 5 6 HOST= 7 PORT=8888 8 ADDR=(HOST,PORT

18、) 9 10 class MyRequestHandler(SRH):11def handle(self):12 print(.connected from:,self.client_address)13 self.wfile.write(%s %s%(ctime(),self.rfile.readline()14 15 tcpServ=TCP(ADDR,MyRequestHandler)16 print(waiting for connection.)17 tcpServ.serve_forever(),2022/12/27,1.4 socketserver模块,1.网络编程,创建socke

19、tserver TCP客户端如下示例所示,这里的客户端很自然地非常像最初的客户端,比服务器像得多,但必须稍微调整它以使其与新服务器很好地配合工作。,1.4 socketserver模块,1.网络编程,1 #!/usr/bin/env python 2 3 from socket import * 4 5 HOST=127.0.0.1 6 PORT=8888 7 BUFSIZ=1024 8 ADDR=(HOST,PORT) 9 10 while True:11tcpCliSock=socket(AF_INET,SOCK_STREAM)12tcpCliSock.connect(ADDR)13dat

20、a=input( )14if not data:15break16tcpCliSock.send(%s %data)17data=tcpCliSock.recv(BUFSIZ)18if not data:19break20print(data.strip()21 tcpCliSock.close(),2022/12/27,1.4 socketserver模块,1.网络编程,执行结果:,这里是socketserverTCP客户端的输出。$ python /usr/tsTclntSS.py applicationThu Sep 1 18:32:45 2016 application flashTh

21、u Sep 1 18:33:50 2016 flash这是服务器的输出。$ python /usr/tsTservSS.pywaiting for connection.connected from:( 127.0.0.1,51245).connected from:( 127.0.0.1,51246),目录,2022/12/27,2,1. 网络编程,2. 因特网应用层客户端,3. Python网络编程实例,2022/12/27,2.因特网应用层客户端,前一节介绍了使用套接字的底层网络通信协议。这种类型的网络是当今因特网中大部分客户端/服务器协议的核心。这些网络协议分别用于文件传输(FTP、S

22、CP等)、阅读新闻组(NNTP)、发送电子邮件(SMTP)和从服务器上下载电子邮件(POP3、IMAP)等。协议的工作方式与前一节介绍的客户端/服务器的例子相似。唯一的区别在于现在使用TCP/IP这样底层的协议来创建新的、有专门用途的协议,以此来实现刚刚介绍的高层服务。,2022/12/27,2.因特网应用层客户端,2.1.1文件传输因特网协议,因特网中最常见的事情就是传输文件。文件传输每时每刻都在发生。有很多协议可以用于在因特网上传输文件,最流行的包括文件传输协议(FTP)、UNIX到UNIX复制协议(UUCP)、用于Web的超文本传输协议(HTTP)。另外,还有(UNIX下的)远程文件复制

23、命令rcp(以及更安全、更灵活的scp和rsync)。,2022/12/27,2.因特网应用层客户端,2.1.2 文件传输协议,其工作流程如下。(1)客户端连接远程主机上的FTP服务器。(2)客户端输入用户名和密码(或“anonymous”和电子邮件地址)。(3)客户端进行各种文件传输和信息查询操作。(4)客户端从远程FTP服务器退出,结束传输。,2022/12/27,2.因特网应用层客户端,2.1.2 文件传输协议,在底层,FTP只使用TCP,而不使用UDP。另外,可以将FTP看作客户端/服务器编程中的特殊情况。因为这里的客户端和服务器都使用两个套接字通信:一个是控制和命令端口(21号端口)

24、,另一个是数据端口(有时是20号端口),如下图所示。,2022/12/27,2.因特网应用层客户端,2.1.2 文件传输协议,FTP有两种模式主动和被动。只有在主动模式下服务器才使用数据端口。在服务器把20号端口设置为数据端口后,它“主动”连接客户端的数据端口;而在被动模式下,服务器只是告诉客户端随机的数据端口号,客户端必须主动建立数据连接。在这种模式下,FTP服务器在建立数据连接时是“被动”的。,2022/12/27,2.因特网应用层客户端,2.1.3 ftplib.FTP类的方法,在一般的FTP事务中,要使用到的指令有login()、cwd()、dir()、pwd()、stor*()、re

25、tr*()和quit()。下表列出了最常用的方法,这个表中列出的方法涵盖了Python中进行FTP客户端编程所需的API,其他没有列出的方法并不是必需的,因为其他方法要么提供辅助或管理功能,要么提供给这些API使用。,2.因特网应用层客户端,2.1.3 ftplib.FTP类的方法,2022/12/27,2.因特网应用层客户端,2.1.4 FTP客户端程序示例,下面的程序是将某台Linux服务器上的600多万个数据文件移到另一台Linux服务器,所有文件的文件名遵循一定的规范,程序成功自动移动了所有文件。,2022/12/27,2.因特网应用层客户端,2.1.4 FTP客户端程序示例,下面的程

26、序是将某台Linux服务器上的600多万个数据文件移到另一台Linux服务器,所有文件的文件名遵循一定的规范,程序成功自动移动了所有文件。见书上(P264、P265),2022/12/27,2.因特网应用层客户端,2.1.5 FTP的其他内容,以下是一些典型的FTP客户端类型。,命令行客户端程序:使用一些FTP客户端程序(如/bin/ftp或NcFTP)进行FTP传输,用户可以在命令行中交互执行FTP传输。GUI客户端程序:与命令行客户端程序相似,但它是一个GUI程序,如WS_FTP、Filezilla、CuteFTP、Fetch、SmartFTP。,2022/12/27,2.因特网应用层客户

27、端,2.1.5 FTP的其他内容,Web浏览器:除了使用HTTP之外,大多数Web浏览器(也称为客户端)可以进行FTP传输。URL/URI的第一部分就用来表示所使用的协议,如“http:/blahblah”。这就告诉浏览器要使用HTTP作为与指定网站传输数据的协议。用过修改协议部分,就可以发送使用FTP的请求,如“ftp:/blahblah”,这与使用HTTP的网页URL很像。自定义应用程序:自己编写的用于FTP文件传输的程序。这些是用于特殊目的的应用程序,一般这种程序不允许用户与服务器交互。,2022/12/27,2.因特网应用层客户端,2.2.1 网络新闻,Usenet新闻系统是一个全球存

28、档的“电子公告档”。系统中各种主题的新闻组一应俱全,从诗歌到政治,从自然语言学到计算机语言,从软件到硬件,从种植到烹饪,招聘/应聘,音乐等。新闻组可以面向全球,也可以只面向某个特定区域。整个系统是一个由大量计算机组成的庞大的全球网络,计算机之间共享Usenet上的帖子。如果某个用户发了一个帖子到本地的Usenet计算机上,这个帖子会被传播到其他相连的计算机上,再由这些计算机传到与它们相连的计算机上,直到这个帖子传播到了全世界,每个人都收到这个帖子为止。帖子在Usenet上的存活时间是有限的,这个时间可以由Usenet系统管理员来指定,也可以为帖子指定一个过期的日期/时间。,2022/12/27

29、,2.因特网应用层客户端,2.2.2 网络新闻传输协议,用户使用网络新闻传输协议(NNTP)在新闻组中下载或发表帖子。该协议由Brain Kantor(加州大学圣地亚哥分校)和Phil Lapsley(加州大学伯克利分校)创建并记录在RFC 977中,于1986年2月公布。其后在2000年10月公布的RFC 2980中对该协议进行了更新。作为客户端/服务器架构的另一个例子,NNTP与FTP的操作方式相似,但更简单。在FTP中,登录、传输数据和控制需要使用不同的端口,而NNTP只使用一个标准端口119来通信。用户向服务器发送一个请求,服务器就做出相应的响应,如下图所示。,2022/12/27,2

30、.因特网应用层客户端,2.2.2 网络新闻传输协议,2022/12/27,2.因特网应用层客户端,2.2.3 Python和NNTP,由于以前已经有了Python和FTP的经验,读者也许可以猜到,有一个nntplib库和一个需要实例化的nntplib.NNTP类。与FTP一样,所要做的就是导入这个Python模块,然后调用相应的方法。先大致看一下这个协议。(1)连接到服务器。(2)登录(根据需要)。(3)发出服务请求。(4)退出。是不是有点熟悉?是的,这与FTP协议极其相似。唯一的区别是根据NNTP服务器配置的不同,登录这一步是可选的。,2022/12/27,2.因特网应用层客户端,2.2.3

31、 Python和NNTP,下面是一段Python伪代码。from mmtplib import NNTPn=NNTP( your.nntp.server)r,c,f,l,g=n.group( comp.lang.python)n.quit()一般来说,登录后需要调用group()方法来选择一个感兴趣的新闻组。该方法返回服务器的回复、文章的数量、第一篇和最后一篇文章的ID、新闻组的名称。有了这些信息后,就可以做一些其他操作,如从头到尾浏览文章、下载整个帖子(文章的标题和内容),或者发表一篇文章等。在展示真实的例子之前,先介绍一下nntplib.NNTP类的一些常用方法。,2.因特网应用层客户端,

32、2.2.4 nntplib.NNTP类方法,2022/12/27,2.因特网应用层客户端,2.2.4 nntplib.NNTP类方法,NNTP客户端程序示例(1)NNTP客户端程序下面为NNTP从“web.aioe.org”获取新闻的一个简单例子。#!/usr/bin/env pythonfrom nntplib import *s = NNTP(web.aioe.org)(resp, count, first, last, name) = s.group(comp.lang.python)(resp, subs) = s.xhdr(subject, (str(first)+-+str(las

33、t)for subject in subs-10:print(subject)number = input(Which article do you want to read? )(reply, num, id, list) = s.body(str(number)for line in list:,2022/12/27,2.因特网应用层客户端,2.2.4 nntplib.NNTP类方法,(2)运行结果Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) MSC v.1900 32 bit (Intel) on win32Type

34、copyright, credits or license() for more information. RESTART: C:UsersAdministratorAppDataLocalProgramsPythonPython35-32nntp.py (179456, Re: manually sorting images?)(179457, Re: Extend unicodedata with a name/pattern/regex search for character entity references?)(179458, Re: Why doesnt my finaliser

35、 run here?)(179459, Re: Extend unicodedata with a name/pattern/regex search for character entity references?)(179460, Re: manually sorting images?)(179461, Re: Why doesnt my finaliser run here?)(179462, Re: Why doesnt my finaliser run here?)(179463, Re: Extend unicodedata with a name/pattern/regex s

36、earch for character entity references?)(179464, Re: manually sorting images?)(179465, Re: Why doesnt my finaliser run here?)Which article do you want to read?,2022/12/27,2.因特网应用层客户端,2.2.5 NNTP的其他内容,关于NNTP的更多内容,可阅读NNTP协议定义/规范(RFC 977),参见http:/tools.ietf.org/html/rfc977和http:/,目录,2022/12/27,2,1. 网络编程,

37、2. 因特网应用层客户端,3. Python网络编程实例,2022/12/27,3. 电子邮件,E-mail的历史比Web还要久远,直到现在,E-mail也是互联网上应用非常广泛的服务。几乎所有的编程语言都支持发送和接收电子邮件,但是先等等,在我们开始编写代码之前,有必要搞清楚电子邮件是如何在互联网上运作的。,2022/12/27,3. 电子邮件,MUA(Mail User Agent):邮件用户代理,你发邮件用的软件。MTA(Mail Transfer Agent):邮件传输代理,发邮件和接受邮件的邮件服务商:新浪邮箱或网易邮箱等。MDA(Mail Delivery Agent):邮件投递管

38、理,邮件最终存储的地方。,3.1 MUA、MDA、MTA是什么,2022/12/27,3. 电子邮件,(1)SMTP是什么SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大多数应用层协议

39、一样,SMTP也存在两个端:在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。,2022/12/27,3. 电子邮件,(2)Python和SMTPPython也有一个smtplib模块和一个需要实例化的smtplib.SMTP类。先回顾一下这个已经熟悉的过程。连接到服务器。登录(根据需要)。发出服务请求。退出。像NNTP一样,登录是可选的,只有在服务器启用了SMTP身份验证(SMTP-AUTH)时才需要登录。SMTP-AUTH在RFC 25

40、54中定义。与NNTP一样,SMTP通信时只要一个端口,这里端口号是25。,2022/12/27,3. 电子邮件,下面是一些Python的伪代码:from smtplib import SMTPn=SMTP()n.qiut()在展示真实的例子之前,先介绍一下smtplib.SMTP类的一些常用方法。,2022/12/27,3. 电子邮件,2022/12/27,3. 电子邮件,在前面介绍SMTP的小节中已经看过这种发送邮件的客户端了。那下载邮件的客户端呢?(1)POPPOP的全称为Post Office Protocol,即邮局协议,俗称POP3,用于电子邮件的接收。本协议主要用于支持使用客户端

41、远程管理在服务器上的电子邮件。(2)IMAPIMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似的邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,,2022/12/27,3. 电子邮件,(3)IMAP与POP协议的区别IMAP协议的特点与POP3协议类似,IMAP(Internet消息访问协议)也是提供面向用户的邮件收取服务。常用的版本是IMAP4。IMAP4改进了POP3的不足,用户可以通过浏览信件头来决定是否收取、删除和检索邮件的特定部分,还可以在服务器上创建或更改文件夹或邮箱,它除了支持POP3协议的脱机操作模式外,还支持联机操作和断连接操作。,谢谢!,2022/12/27,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号