標籤:
1.網路設計模組
1.1 socket模組
根據串連啟動的方式以及本地通訊端要串連的目標,通訊端之間的串連過程可以分為三個步驟:伺服器監聽,用戶端請求,串連確認。 1)伺服器監聽:是伺服器端通訊端並不定位具體的用戶端通訊端,而是處於等待串連的狀態,即時監控網路狀態。 2)用戶端請求:是指由用戶端的通訊端提出串連請求,要串連的目標是伺服器端的通訊端。為此,用戶端的通訊端必須首先描述它要已連線的服務器的通訊端,指出伺服器端套 接字的地址和連接埠號碼,然後就向伺服器端通訊端提出串連請求。 3)串連確認:是指當伺服器端通訊端監聽到或者說接收到用戶端通訊端的串連請求,它就響應用戶端通訊端的請求,建立一個新的線程,把伺服器端通訊端的描述發給客戶 端,一旦用戶端確認了此描述,串連就建立好了。而伺服器端通訊端繼續處於監聽狀態,繼續接收其他用戶端通訊端的串連請求。
在網路編程中的一個基本組件就是通訊端(socket)。通訊端主要是兩個程式之間“資訊通道”。程式可能(通過網路連接)分布在不同的電腦上,通過通訊端相互發送資訊。在Python中的大多數的網路編程都隱藏了socket模組的基本細節,並且不直接和通訊端互動。
通訊端包括兩個:伺服器通訊端和用戶端通訊端。建立一個伺服器通訊端後,讓它等待串連。這樣它就在某個網路地址處(ip地址和一個連接埠號碼的組合)監聽。處理用戶端通訊端通常比處理伺服器通訊端容易,因為伺服器必須準備隨時處理用戶端的串連,同時還要處理多個串連,而用戶端只是簡單的串連,完成事務,中斷連線。
一個通訊端就是一個socket模組中的socket類的執行個體。有三個參數:
第一個是地址族(預設是socket.AF_INET);
第二個參數是流(預設是socket.SOCK_STREAM,預設值)或資料報(socket.SOCK_DGRAM)通訊端;
第三個參數是使用的協議(預設是0,使用預設值即可)。對於一個普通的通訊端,不需要提供任何參數。
伺服器端通訊端使用bind方法後,再調用listen方法監聽這個給定地址。用戶端通訊端使用connect方法串連到伺服器在connect方法中使用的地址與bind方法中的地址相同。在這種情況下,一個地址就是一個格式為(host,port)的元組,其中host是主機名稱,port是連接埠號碼。Listen方法只有一個參數,即伺服器未處理的串連的長度。
伺服器通訊端開始監聽後,它就可以接受用戶端的串連。這個步驟使用accept方法來完成。這個方法會堵塞(等待)直到用戶端串連,然後該方法就返回一個格式為(client,address)的元組。伺服器能處理用戶端到它滿意的程度,然後調用一個accept方法開始等待下一個串連。這個過程通常都是在一個無限迴圈中實現的。
通訊端有兩個方法:send和rev,用於傳輸資料。可以使用字串參數調用send以發送資料,用一個所需的(最大)位元組數做參數調用recv來接收資料。如果不能確定使用哪個數字比較好,那麼1024是個很好的選擇。
1 #小型伺服器 2 import socket 3 s=socket.socket() 4 host=socket.gethostname() 5 port=1234 6 s.bind((host,port)) 7 s.listen(5) 8 while True: 9 c,addr = s.accept()10 print "Got connect from",addr11 c.send(‘tkx for connecting‘)12 c.close()13 14 15 #小型用戶端16 17 import socket18 s=socket.socket()19 host=socket.gethostname()20 port=123421 s.connect((host,port))22 print s.recv(1024)
1.2 urllib和urllib2模組
在能使用的各種網路工作庫中,功能最強大的是urllib和urllib2。它們能讓通過網路訪問檔案,就像那些檔案存在於你電腦上一樣。通過一個簡單的函數調用,幾乎可以把任何URL所指向的東西用作程式的輸入。這兩個模組功能差不多,但urllib更好一些。如果只使用簡單的下載,urllib就足夠了。但如果需要使用HTTP驗證或cookie或者要為自己的協議寫擴充程式的話,urllib2是個好的選擇。
1)開啟遠程檔案
#開啟遠程檔案>>> from urllib import urlopen>>> webpage=urlopen("http://blog.csdn.net/signjing")
Urlopen返回的類檔案對象支援close、read、readline和readlines方法,當然也支援迭代。
2)擷取遠程檔案
函數urlopen提供一個能從中讀取資料的類檔案對象。如果希望urllib為你下載檔案並在本地檔案存在一個檔案的副本,那麼可以使用urlretrieve。
Urlretrieve返回一個元組(filename,headers)而不是類檔案對象,filename是本地檔案的名字(由urllib自動建立),headers包含一些遠程檔案的資訊。
>>> import urllib>>> urllib.urlretrieve(‘http://www.baidu.com‘,‘d:\\baidu.html‘)(‘d:\\baidu.html‘, <httplib.HTTPMessage instance at 0x02BFC788>)
如果沒有指定檔案名稱,檔案會放在臨時的位置,用open函數可以開啟它。完成了對它的操作,就可以刪除它以節省空間的,要刪除臨時檔案,可以用urlcleanup函數,不需要提供參數。
1.3 其他模組
模組 |
描述 |
asynchat |
asyncore的增強版本 |
asyncore |
非同步通訊端處理常式 |
cgi |
基本的CGI支援 |
Cookie |
Cookie對象操作,主要用於伺服器 |
cookielib |
用戶端cookie支援 |
email |
Email訊息支援 |
ftplib |
FTP用戶端模組 |
gopherlib |
gopher用戶端模組 |
httplib |
http用戶端模組 |
imaplib |
imap4用戶端模組 |
mailbox |
讀取幾種郵箱的格式 |
mailcap |
通過mailcap檔案訪問MIME配置 |
mhlib |
訪問MH郵箱 |
nntplib |
NNTP用戶端模組 |
poplib |
pop用戶端模組 |
robotparser |
支援解析web伺服器的robot檔案 |
SimpleXMLRPCServer |
一個簡單的xml-rpc伺服器 |
smtpd |
smtp伺服器端模組 |
smtplib |
smtp用戶端模組 |
telnetlib |
telnet用戶端模組 |
urlparse |
支援解釋url |
xmlrpclib |
xml-rpc的用戶端支援 |
2. SocketServer
SocketServer模組是標準庫中很多伺服器架構的基礎。SocketServer包含了4個基本的類:針對TCP通訊端流的TCPServer;針對UDP資料通訊端的UDPServer;以及針對性不強的UnixStreamServer和UnixDatagramServer。
3. 多串連
到目前為止討論的伺服器解決方案都是同步的:即一次只能串連一個用戶端並處理它的請求。怎麼樣同時處理多個串連呢?
三種方法:分叉(forking)、線程(threading)以及非同步I/O(asynchronous I/O)。
4. Twisted
Twisted是一個事件驅動的python網路架構,原來是為網路遊戲開發的,現在被所有類型的網路軟體使用。
python基礎教程總結13——網路編程,