版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
2023/6/4第11章網(wǎng)絡(luò)編程主講人:目錄2023/6/421.網(wǎng)絡(luò)編程2.
因特網(wǎng)應(yīng)用層客戶端3.
Python網(wǎng)絡(luò)編程實例2023/6/41.網(wǎng)絡(luò)編程本節(jié)將簡要介紹使用套接字進行網(wǎng)絡(luò)編程的知識。在此之前,將介紹一些有關(guān)網(wǎng)絡(luò)編程的背景信息,以及套接字如何應(yīng)用于Python之中,然后展示如何使用Python的相關(guān)網(wǎng)絡(luò)編程模塊來創(chuàng)建網(wǎng)絡(luò)應(yīng)用程序。2023/6/41.1客戶端/服務(wù)器架構(gòu)什么是客戶端服務(wù)器架構(gòu)?1.網(wǎng)絡(luò)編程2023/6/41.2套接字1.網(wǎng)絡(luò)編程分為兩種類型:基于文件(AF_UNIX)的和面向網(wǎng)絡(luò)的(AF_INET)主機-端口對:合法的端口號范圍為0~65535。其中,小于1024的端口號為系統(tǒng)保留端口。HOST=''
PORT=8888
BUFSIZ=1024
ADDR=(HOST,PORT)2023/6/41.2.1面向連接的套接字(TCP)1.網(wǎng)絡(luò)編程①
服務(wù)器端程序創(chuàng)建套接字(socket)。將套接字綁定到一個本地地址和端口上(bind)。將套接字設(shè)為監(jiān)聽模式,準備接受客戶請求(listen)。等待客戶請求到來;當請求到來后,接受連接請求,返回一個新的對應(yīng)于此次連接的套接字(accept)。用返回的套接字和客戶端進行通信(send/recv)。返回,等待另一客戶的請求。關(guān)閉套接字。2023/6/41.2.1面向連接的套接字(TCP)1.網(wǎng)絡(luò)編程
②客戶端程序創(chuàng)建套接字(socket)。向服務(wù)器發(fā)出連接請求(connect)。和服務(wù)器端進行通信(send/recv)。關(guān)閉套接字。2023/6/41.2.2面向無連接的套接字(UDP)1.網(wǎng)絡(luò)編程①
服務(wù)器端程序創(chuàng)建套接字(socket)。將套接字綁定到一個本地地址和端口上(bind)。等待接收數(shù)據(jù)(recvfrom)。關(guān)閉套接字。
②客戶端程序創(chuàng)建套接字(socket)。向服務(wù)器發(fā)送數(shù)據(jù)(sendto)。關(guān)閉套接字。2023/6/41.3.1Python中socket模塊函數(shù)1.網(wǎng)絡(luò)編程(1)服務(wù)器端(server)創(chuàng)建socket對象。調(diào)用socket構(gòu)造函數(shù)。如:
socket=socket.socket(family,type)將socket綁定到指定地址。這是通過socket對象的bind方法來實現(xiàn)的:socket.bind(address)2023/6/41.網(wǎng)絡(luò)編程(1)服務(wù)器端(server)使用socket套接字的listen方法接收連接請求:socket.listen(backlog)服務(wù)器套接字通過socket的accept方法等待客戶請求一個連接。connection,address=socket.accept()1.3.1Python中socket模塊函數(shù)2023/6/41.網(wǎng)絡(luò)編程(1)服務(wù)器端(server)處理階段,服務(wù)器和客戶端通過send和recv方法通信(傳輸數(shù)據(jù))傳輸結(jié)束,服務(wù)器調(diào)用socket的close方法關(guān)閉連接。1.3.1Python中socket模塊函數(shù)2023/6/41.網(wǎng)絡(luò)編程(2)客戶端(client)創(chuàng)建一個socket以連接服務(wù)器:socket=socket.socket(family,type)使用socket的connect方法連接服務(wù)器。對于AF_INET家族,連接格式如下:
socket.connect((host,port))1.3.1Python中socket模塊函數(shù)2023/6/41.網(wǎng)絡(luò)編程(2)客戶端(client)處理階段,客戶和服務(wù)器將通過send方法和recv方法通信。傳輸結(jié)束,客戶通過調(diào)用socket的close方法關(guān)閉連接。1.3.1Python中socket模塊函數(shù)2023/6/41.3.2套接字對象內(nèi)置方法1.網(wǎng)絡(luò)編程名
稱描
述服務(wù)器套接字方法s.bind()將地址(主機名、端口號對)綁定到套接字上s.listen()設(shè)置并啟動TCP監(jiān)聽器s.accept()被動接受TCP客戶端連接,一直等待直到連接到達(阻塞)客戶端套接字方法s.connect()主動發(fā)起TCP服務(wù)器連接s.connect_ex()connect()的擴展版本,此時會以錯誤碼的形式返回問題,而不是拋出一個異常普通的套接字方法s.recv()接受TCP消息s.recv_into()接受TCP消息到指定的緩沖區(qū)s.send()發(fā)送TCP消息s.sendall()完整地發(fā)送TCP消息s.recvfrom()接受UDP消息s.recvfrom_into()接受UDP消息到指定的緩沖區(qū)s.sendto()發(fā)送UDP消息s.close()關(guān)閉套接字2023/6/41.3.3創(chuàng)建TCP服務(wù)器1.網(wǎng)絡(luò)編程偽代碼:ss=socket()ss.bind()ss.listen()inf_loop: cs=ss.accept() comm_loop: cs.recv()/cs.send() cs.close()ss.close()1.3.3創(chuàng)建TCP服務(wù)器1.網(wǎng)絡(luò)編程1#!/usr/bin/envpython23fromsocketimport*4fromtimeimportctime56HOST=''7PORT=88888BUFSIZ=10249ADDR=(HOST,PORT)1011tcpSerSock=socket(AF_INET,SOCK_STREAM)12tcpSerSock.bind(ADDR)13tcpSerSock.listen(5)1415whileTrue:16 print('waitingforconnection...')17 tcpCliSock,addr=tcpSerSock.accept()18 print('...connectedfrom:',addr)1920 whileTrue:21 data=tcpCliSock.recv(BUFSIZ)22 ifnotdata:23 break24 print(data)25 tcpCliSock.send('[%s]%s'%(ctime(),data))2627 tcpCliSock.close()28tcpSerSock.close()2023/6/41.3.4創(chuàng)建TCP客戶端1.網(wǎng)絡(luò)編程偽代碼:cs=socket()sc.connect()comm_loop: cs.send()/cs.recv()cs.close()2023/6/41.3.4創(chuàng)建TCP客戶端1.網(wǎng)絡(luò)編程1#!/usr/bin/envpython23fromsocketimport*45HOST=''6PORT=88887BUFSIZ=10248ADDR=(HOST,PORT)910tcpCliSock=socket(AF_INET,SOCK_STREAM)11tcpCliSock.connect(ADDR)1213whileTrue:14 data=input('>')15 ifnotdata:16 break17 tcpCliSock.send(data)18 data=tcpCliSock.recv(BUFSIZ)19 ifnotdata:20 break21 print(data)2223tcpCliSock.close()2023/6/41.3.4運行結(jié)果1.網(wǎng)絡(luò)編程現(xiàn)在,我們給出客戶端對應(yīng)的輸入和輸出,它以一個未帶輸入數(shù)據(jù)的簡單Return(或Enter)鍵結(jié)束。
~$python/usr/tcpClie.py>hello[ThuSep115:35:452016]hello>howareyou[ThuSep115:36:092016]howareyou>
2023/6/41.3.4運行結(jié)果1.網(wǎng)絡(luò)編程服務(wù)器的輸出主要是診斷性的。
~$python/usr/tcpServ.pywaitingforconnection...('...connectedfrom:',('',48426))hellohowareyouwaitingforconnection...2023/6/41.3.5創(chuàng)建UDP服務(wù)器1.網(wǎng)絡(luò)編程UDP服務(wù)器不需要TCP服務(wù)器那么多的設(shè)置,因為它不是面向連接的。除了等待傳入的連接以外,幾乎不需要其他工作。
ss.=socket()ss.bind()inf_loop: cs=ss.recvfrom()/ss.sendto()ss.close()2023/6/41.3.5創(chuàng)建UDP服務(wù)器1.網(wǎng)絡(luò)編程1#!/usr/bin/envpython23fromsocketimport*4fromtimeimport*56HOST=''7PORT=88888BUFSIZ=10249ADDR=(HOST,PORT)1011udpSerSock=socket(AF_INET,SOCK_DGRAM)12udpSerSock.bind(ADDR)1314whileTrue:15 print('waitingformessage...')16 data,addr=udpSerSock.recvfrom(BUFSIZ)17 ifnotdata:18 break19 print(data)20 udpSerSock.sendto('[%s]%s'%(ctime(),data),addr)21 print('...receivedfromandreturnedto:',addr)2223udpSerSock.close()2023/6/41.3.6創(chuàng)建UDP客戶端1.網(wǎng)絡(luò)編程在本節(jié)中所強調(diào)的4個客戶端中,UDP客戶端的代碼是最短的。它的偽代碼如下所示:
cs=socket()somm_loop: cs.sendto/cs.recvfrom()cs.close()
一旦創(chuàng)建了套接字對象,就進入了對話循環(huán)之中,在這里我們與服務(wù)器交換消息。最后,當通信結(jié)束時,就會關(guān)閉套接字。2023/6/41.3.6創(chuàng)建UDP客戶端1.網(wǎng)絡(luò)編程1#!/usr/bin/envpython23fromsocketimport*45HOST='localhost'6PORT=88887BUFSIZ=10248ADDR=(HOST,PORT)910udpCliSock=socket(AF_INET,SOCK_DGRAM)1112whileTrue:13 data=input('>')14 ifnotdata:15 break16 udpCliSock.sendto(data,ADDR)17 data,ADDR=udpCliSock.recvfrom(BUFSIZ)18 ifnotdata:19 break20 print(data)2122udpCliSock.close()2023/6/41.3.6運行結(jié)果1.網(wǎng)絡(luò)編程$python/usr/tsUclnt.py>Hello[ThuSep117:45:362016]Hello>World[ThuSep117:45:502016]World>
服務(wù)器的輸出主要是診斷性的:
$python/usr/tsUserv.pywaitingformessage......receivedfromandreturnedto:('',48375))waitingformessage...2023/6/41.3.7
socket模塊屬性1.網(wǎng)絡(luò)編程屬性名稱描
述數(shù)據(jù)屬性AF_UNIX、AF_INET、AF_INET6、AF_NETLINK、AF_TIPCPython中支持的套接字地址家族SO_STREAM、SO_DGRAM套接字類型(TCP=流,UDP=數(shù)據(jù)包)has_ipv6指示是否支持IPv6的布爾標記異常error套接字相關(guān)錯誤herror主機和地址相關(guān)錯誤gaierror地址相關(guān)錯誤timeout超時時間函數(shù)socket()以給定的地址家族、套接字類型和協(xié)議類型(可選)創(chuàng)建一個套接字對象socketpair()以給定的地址家族、套接字類型和協(xié)議類型(可選)創(chuàng)建一對套接字對象create_connection()常規(guī)函數(shù),它接收一個地址(主機名,端口號)對,返回套接字對象fromfd()以一個打開的文件描述符創(chuàng)建一個套接字對象ssl()通過套接字啟動一個安全套接字層連接;不執(zhí)行證書驗證2023/6/41.4
socketserver模塊1.網(wǎng)絡(luò)編程socketserver是標準庫中的一個高級模塊,它的目標是簡化很多樣板代碼,它們是創(chuàng)建網(wǎng)絡(luò)客戶端和服務(wù)器客戶端所必需的代碼。2023/6/41.4
socketserver模塊1.網(wǎng)絡(luò)編程創(chuàng)建socketserverTCP服務(wù)器(1)socketserverTCP服務(wù)器示例首先導(dǎo)入服務(wù)器類,然后定義與之前相同的主機常量。其次是請求處理程序類,最后啟動它。更多的細節(jié)請查看下面的代碼。2023/6/41.4
socketserver模塊1.網(wǎng)絡(luò)編程1#!/usr/bin/envpython23fromsocketserverimport(TCPServerasTCP,StreamRequestHandlerasSRH)4fromtimeimportctime56HOST=''7PORT=88888ADDR=(HOST,PORT)910classMyRequestHandler(SRH):11 defhandle(self):12 print('...connectedfrom:',self.client_address)13 self.wfile.write('[%s]%s'%(ctime(),self.rfile.readline()))1415tcpServ=TCP(ADDR,MyRequestHandler)16print('waitingforconnection...')17tcpServ.serve_forever()2023/6/41.4
socketserver模塊1.網(wǎng)絡(luò)編程創(chuàng)建socketserverTCP客戶端如下示例所示,這里的客戶端很自然地非常像最初的客戶端,比服務(wù)器像得多,但必須稍微調(diào)整它以使其與新服務(wù)器很好地配合工作。1.4
socketserver模塊1.網(wǎng)絡(luò)編程1#!/usr/bin/envpython23fromsocketimport*45HOST=''6PORT=88887BUFSIZ=10248ADDR=(HOST,PORT)910whileTrue:11 tcpCliSock=socket(AF_INET,SOCK_STREAM)12 tcpCliSock.connect(ADDR)13 data=input('>')14 ifnotdata:15 break16 tcpCliSock.send('%s'%data)17 data=tcpCliSock.recv(BUFSIZ)18 ifnotdata:19 break20 print(data.strip())21tcpCliSock.close()2023/6/41.4
socketserver模塊1.網(wǎng)絡(luò)編程執(zhí)行結(jié)果:這里是socketserverTCP客戶端的輸出。
$python/usr/tsTclntSS.py>application[ThuSep118:32:452016]application>flash[ThuSep118:33:502016]flash>
這是服務(wù)器的輸出。
$python/usr/tsTservSS.pywaitingforconnection......connectedfrom:('',51245)...connectedfrom:('',51246)目錄2023/6/421.網(wǎng)絡(luò)編程2.因特網(wǎng)應(yīng)用層客戶端3.
Python網(wǎng)絡(luò)編程實例2023/6/42.因特網(wǎng)應(yīng)用層客戶端前一節(jié)介紹了使用套接字的底層網(wǎng)絡(luò)通信協(xié)議。這種類型的網(wǎng)絡(luò)是當今因特網(wǎng)中大部分客戶端/服務(wù)器協(xié)議的核心。這些網(wǎng)絡(luò)協(xié)議分別用于文件傳輸(FTP、SCP等)、閱讀新聞組(NNTP)、發(fā)送電子郵件(SMTP)和從服務(wù)器上下載電子郵件(POP3、IMAP)等。協(xié)議的工作方式與前一節(jié)介紹的客戶端/服務(wù)器的例子相似。唯一的區(qū)別在于現(xiàn)在使用TCP/IP這樣底層的協(xié)議來創(chuàng)建新的、有專門用途的協(xié)議,以此來實現(xiàn)剛剛介紹的高層服務(wù)。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.1文件傳輸因特網(wǎng)協(xié)議因特網(wǎng)中最常見的事情就是傳輸文件。文件傳輸每時每刻都在發(fā)生。有很多協(xié)議可以用于在因特網(wǎng)上傳輸文件,最流行的包括文件傳輸協(xié)議(FTP)、UNIX到UNIX復(fù)制協(xié)議(UUCP)、用于Web的超文本傳輸協(xié)議(HTTP)。另外,還有(UNIX下的)遠程文件復(fù)制命令rcp(以及更安全、更靈活的scp和rsync)。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.2文件傳輸協(xié)議其工作流程如下。(1)客戶端連接遠程主機上的FTP服務(wù)器。(2)客戶端輸入用戶名和密碼(或“anonymous”和電子郵件地址)。(3)客戶端進行各種文件傳輸和信息查詢操作。(4)客戶端從遠程FTP服務(wù)器退出,結(jié)束傳輸。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.2文件傳輸協(xié)議在底層,F(xiàn)TP只使用TCP,而不使用UDP。另外,可以將FTP看作客戶端/服務(wù)器編程中的特殊情況。因為這里的客戶端和服務(wù)器都使用兩個套接字通信:一個是控制和命令端口(21號端口),另一個是數(shù)據(jù)端口(有時是20號端口),如下圖所示。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.2文件傳輸協(xié)議FTP有兩種模式—主動和被動。只有在主動模式下服務(wù)器才使用數(shù)據(jù)端口。在服務(wù)器把20號端口設(shè)置為數(shù)據(jù)端口后,它“主動”連接客戶端的數(shù)據(jù)端口;而在被動模式下,服務(wù)器只是告訴客戶端隨機的數(shù)據(jù)端口號,客戶端必須主動建立數(shù)據(jù)連接。在這種模式下,F(xiàn)TP服務(wù)器在建立數(shù)據(jù)連接時是“被動”的。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.3ftplib.FTP類的方法在一般的FTP事務(wù)中,要使用到的指令有l(wèi)ogin()、cwd()、dir()、pwd()、stor*()、retr*()和quit()。下表列出了最常用的方法,這個表中列出的方法涵蓋了Python中進行FTP客戶端編程所需的API,其他沒有列出的方法并不是必需的,因為其他方法要么提供輔助或管理功能,要么提供給這些API使用。2.因特網(wǎng)應(yīng)用層客戶端2.1.3ftplib.FTP類的方法方
法描
述login(user="anonymous",passwd="",
acct="")登錄FTP服務(wù)器,所有參數(shù)都是可選的pwd()獲得當前工作目錄cwd(path)把當前工作目錄設(shè)置為path所示的路徑dir([path[,…[,cb]]])顯示path目錄里的內(nèi)容,可選的參數(shù)cb是一個回調(diào)函數(shù),會傳遞給retrlines()方法nlst([path[,…]])與dir()類似,但返回一個文件名列表,而不是顯示這些文件名retrlines(cmd,[,cb])給定FTP命令(如“STORfilename”),用來下載文本文件??蛇x的回調(diào)函數(shù)cb用于處理文件的每一行rename(old,new)把遠程文件old重命名為newdelete(path)刪除位于path的遠程文件mkd(directory)創(chuàng)建遠程目錄rmd(directory)刪除遠程目錄quit()關(guān)閉連接并退出2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.4FTP客戶端程序示例下面的程序是將某臺Linux服務(wù)器上的600多萬個數(shù)據(jù)文件移到另一臺Linux服務(wù)器,所有文件的文件名遵循一定的規(guī)范,程序成功自動移動了所有文件。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.4FTP客戶端程序示例下面的程序是將某臺Linux服務(wù)器上的600多萬個數(shù)據(jù)文件移到另一臺Linux服務(wù)器,所有文件的文件名遵循一定的規(guī)范,程序成功自動移動了所有文件。見書上(P264、P265)2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.5FTP的其他內(nèi)容以下是一些典型的FTP客戶端類型。命令行客戶端程序:使用一些FTP客戶端程序(如/bin/ftp或NcFTP)進行FTP傳輸,用戶可以在命令行中交互執(zhí)行FTP傳輸。GUI客戶端程序:與命令行客戶端程序相似,但它是一個GUI程序,如WS_FTP、Filezilla、CuteFTP、Fetch、SmartFTP。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.1.5FTP的其他內(nèi)容Web瀏覽器:除了使用HTTP之外,大多數(shù)Web瀏覽器(也稱為客戶端)可以進行FTP傳輸。URL/URI的第一部分就用來表示所使用的協(xié)議,如“http://blahblah”。這就告訴瀏覽器要使用HTTP作為與指定網(wǎng)站傳輸數(shù)據(jù)的協(xié)議。用過修改協(xié)議部分,就可以發(fā)送使用FTP的請求,如“ftp://blahblah”,這與使用HTTP的網(wǎng)頁URL很像。自定義應(yīng)用程序:自己編寫的用于FTP文件傳輸?shù)某绦?。這些是用于特殊目的的應(yīng)用程序,一般這種程序不允許用戶與服務(wù)器交互。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.2.1網(wǎng)絡(luò)新聞Usenet新聞系統(tǒng)是一個全球存檔的“電子公告檔”。系統(tǒng)中各種主題的新聞組一應(yīng)俱全,從詩歌到政治,從自然語言學(xué)到計算機語言,從軟件到硬件,從種植到烹飪,招聘/應(yīng)聘,音樂等。新聞組可以面向全球,也可以只面向某個特定區(qū)域。整個系統(tǒng)是一個由大量計算機組成的龐大的全球網(wǎng)絡(luò),計算機之間共享Usenet上的帖子。如果某個用戶發(fā)了一個帖子到本地的Usenet計算機上,這個帖子會被傳播到其他相連的計算機上,再由這些計算機傳到與它們相連的計算機上,直到這個帖子傳播到了全世界,每個人都收到這個帖子為止。帖子在Usenet上的存活時間是有限的,這個時間可以由Usenet系統(tǒng)管理員來指定,也可以為帖子指定一個過期的日期/時間。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.2.2網(wǎng)絡(luò)新聞傳輸協(xié)議用戶使用網(wǎng)絡(luò)新聞傳輸協(xié)議(NNTP)在新聞組中下載或發(fā)表帖子。該協(xié)議由BrainKantor(加州大學(xué)圣地亞哥分校)和PhilLapsley(加州大學(xué)伯克利分校)創(chuàng)建并記錄在RFC977中,于1986年2月公布。其后在2000年10月公布的RFC2980中對該協(xié)議進行了更新。作為客戶端/服務(wù)器架構(gòu)的另一個例子,NNTP與FTP的操作方式相似,但更簡單。在FTP中,登錄、傳輸數(shù)據(jù)和控制需要使用不同的端口,而NNTP只使用一個標準端口119來通信。用戶向服務(wù)器發(fā)送一個請求,服務(wù)器就做出相應(yīng)的響應(yīng),如下圖所示。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.2.2網(wǎng)絡(luò)新聞傳輸協(xié)議2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.2.3
Python和NNTP由于以前已經(jīng)有了Python和FTP的經(jīng)驗,讀者也許可以猜到,有一個nntplib庫和一個需要實例化的nntplib.NNTP類。與FTP一樣,所要做的就是導(dǎo)入這個Python模塊,然后調(diào)用相應(yīng)的方法。先大致看一下這個協(xié)議。(1)連接到服務(wù)器。(2)登錄(根據(jù)需要)。(3)發(fā)出服務(wù)請求。(4)退出。是不是有點熟悉?是的,這與FTP協(xié)議極其相似。唯一的區(qū)別是根據(jù)NNTP服務(wù)器配置的不同,登錄這一步是可選的。2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.2.3
Python和NNTP下面是一段Python偽代碼。frommmtplibimportNNTPn=NNTP('your.nntp.server')r,c,f,l,g=n.group('comp.lang.python')…n.quit()一般來說,登錄后需要調(diào)用group()方法來選擇一個感興趣的新聞組。該方法返回服務(wù)器的回復(fù)、文章的數(shù)量、第一篇和最后一篇文章的ID、新聞組的名稱。有了這些信息后,就可以做一些其他操作,如從頭到尾瀏覽文章、下載整個帖子(文章的標題和內(nèi)容),或者發(fā)表一篇文章等。在展示真實的例子之前,先介紹一下nntplib.NNTP類的一些常用方法。2.因特網(wǎng)應(yīng)用層客戶端2.2.4
nntplib.NNTP類方法方
法描
述group(name)選擇一個組的名字,返回一個元祖(rsp,ct,fst,lst,group),分別表示服務(wù)器響應(yīng)信息、文章數(shù)量、第一個和最后一個文章的編號、組名,所有數(shù)據(jù)都是字符串(返回的group與傳進去的name應(yīng)該是相同的)xhdr(hdr,artrg[,ofile])返回文章范圍artrg(“頭-尾”的格式)內(nèi)文章hdr頭的列表,或把數(shù)據(jù)輸出到文件ofile中body(id[,ofile])根據(jù)id獲取文章正文,id可以是消息的ID,也可以是文章編號(以字符串形式表示),返回一個元組(rsp,anum,mid,data),分別表示服務(wù)器響應(yīng)信息、文章編號(以字符串形式表示)、消息ID、文章所有行的列表,或把數(shù)據(jù)輸出到文件ofile中head(id)與body()類似,返回相同的元組,只是返回的行列表中只包括文章的標題article(id)同樣與body()類似,返回相同的元組,只是返回的行列表中同時包括文章標題和正文stat(id)讓文章的“指針”指向id(即前面的消息ID或文章編號)。返回一個與body()相同的元組(rsp,anum,mid),但不包括文章的數(shù)據(jù)next()用法和stat()類似,把文章指針移到下一篇文章,返回與stat()相似的元組last()用法和stat()類似,把文章指針移到最后一篇文章,返回與stat()相似的元組post(ufile)上傳ufile文件對象里的內(nèi)容(使用ufile.readline()),并發(fā)布到當前新聞組中quit()關(guān)閉連接并退出2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.2.4
nntplib.NNTP類方法NNTP客戶端程序示例(1)NNTP客戶端程序下面為NNTP從“”獲取新聞的一個簡單例子。
#!/usr/bin/envpython
fromnntplibimport*
s=NNTP('')(resp,count,first,last,name)=s.group('comp.lang.python')(resp,subs)=s.xhdr('subject',(str(first)+'-'+str(last)))forsubjectinsubs[-10:]: print(subject)number=input('Whicharticledoyouwanttoread?')(reply,num,id,list)=s.body(str(number))forlineinlist:2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.2.4
nntplib.NNTP類方法(2)運行結(jié)果
Python3.5.2(v3.5.2:4def2a2901a5,Jun252016,22:01:18)[MSCv.190032bit(Intel)]onwin32Type"copyright","credits"or"license()"formoreinformation.>>>
RESTART:C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\nntp.py('179456','Re:manuallysortingimages?')('179457','Re:Extendunicodedatawithaname/pattern/regexsearchforcharacterentityreferences?')('179458',"Re:Whydoesn'tmyfinaliserrunhere?")('179459','Re:Extendunicodedatawithaname/pattern/regexsearchforcharacterentityreferences?')('179460','Re:manuallysortingimages?')('179461',"Re:Whydoesn'tmyfinaliserrunhere?")('179462',"Re:Whydoesn'tmyfinaliserrunhere?")('179463','Re:Extendunicodedatawithaname/pattern/regexsearchforcharacterentityreferences?')('179464','Re:manuallysortingimages?')('179465',"Re:Whydoesn'tmyfinaliserrunhere?")Whicharticledoyouwanttoread?2023/6/42.因特網(wǎng)應(yīng)用層客戶端2.2.5
NNTP的其他內(nèi)容關(guān)于NNTP的更多內(nèi)容,可閱讀NNTP協(xié)議定義/規(guī)范(RFC977),參見/html/rfc977和/enp/protocol/nntp.html頁面。其他相關(guān)的RFC還包括1036和2980。關(guān)于Python對NNTP的更多支持,可以從這里開始:/library/nntplib。目錄2023/6/421.網(wǎng)絡(luò)編程2.
因特網(wǎng)應(yīng)用層客戶端3.
Python網(wǎng)絡(luò)編程實例2023/6/43.電子郵件E-mail的歷史比Web還要久遠,直到現(xiàn)在,E-mail也是互聯(lián)網(wǎng)上應(yīng)用非常廣泛的服務(wù)。幾乎所有的編程語言都支持發(fā)送和接收電子郵件,但是先等等,在我們開始編寫代碼之前,有必要搞清楚電子郵件是如何在互聯(lián)網(wǎng)上運作的。2023/6/43.電子郵件MUA(MailUserAgent):郵件用戶代理,你發(fā)郵件用的軟件。MTA(MailTransferAgent):郵件傳輸代理,發(fā)郵件和接受郵件的郵件服務(wù)商:新浪郵箱或網(wǎng)易郵箱等。MDA(MailDeliveryAgent):郵件投遞管理,郵件最終存儲的地方。3.1
MUA、MDA、MTA是什么2023/6/43.電子郵件(1)SMTP是什么SMTP即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議簇,它幫助每臺計算機在發(fā)送或中轉(zhuǎn)信件時找到下一個目
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024保安服務(wù)合同(范本)公司保安合同范本
- 2024年丙丁雙方關(guān)于購買房產(chǎn)合同標的的協(xié)議書
- 2024年簡單貨物運輸合同格式
- 2024年度金融風(fēng)險管理系統(tǒng)定制開發(fā)合同
- 2024合同補充協(xié)議
- 2024年協(xié)議離婚應(yīng)當注意的要點
- 網(wǎng)吧轉(zhuǎn)讓合同范本
- 律師代理公司股票上市合同范本
- 2024日本留學(xué)租房合同簽訂須知
- 2024借款居間服務(wù)合同
- 2024江蘇省沿海開發(fā)集團限公司招聘23人高頻難、易錯點500題模擬試題附帶答案詳解
- 2024年計算機二級WPS考試題庫380題(含答案)
- 22G101三維彩色立體圖集
- 部編版語文三年級上冊單元知識點梳理歸納
- TS16949推行計劃
- 標準吞咽功能評價量表(SSA)2頁
- 2009年勒流街道小學(xué)即席作文競賽獲獎結(jié)果(精)
- 三年級地方課程半島工程和溫州大橋教材
- 人民醫(yī)院便民惠民措施服務(wù)工作開展情況總結(jié)
- 用友華表伙伴商務(wù)手冊.
- 大學(xué)生健康人格與心理健康PPT課件
評論
0/150
提交評論