python學習第十四章——網絡編程

1.套接字:一個套接字就是一個socket模塊中的socket類的實例,它的實例化需要3個參數:第一個參數是地址族(默認是socket.AF_INET);第二個參數是流(socket.SOCK_STREAM,默認值)或數據報(socket.SOCK_DGRAM)套接字;第三個參數是使用的協議(默認是0,使用默認值即可)。對於一個普通的套接字,不需要提供任何參數。服務器端套接字使用bind方法後,再調用listen方法去監聽這個給定的地址。客戶端套接字使用connect方法連接到服務器在connect方法中使用的地址與bind方法中的地址相同(在服務器端,能實現很多功能,比如使用函數socket.gethostname得到當前的主機名)。listen方法只有一個參數,即服務器未處理的連接的長度(即允許排隊等待的連接數目,這些連接在停止接收之前等待接收)。服務器端套接字開始監聽後,它就可以接受客戶端的連接。這個步驟使用accept方法來完成。這個方法會阻塞直到客戶端連接,然後改方法就返回一個格式爲(client,address)的元組,client是一個客戶端套接字,address是監聽的地址。套接字有兩個方法:send和recv(用於接收),用於傳輸數據。可以使用字符串參數調用send以發送數據,用一個所需的最大字節數做參數調用recv來接收數據。如果不能確定使用哪個數字比較好,1024是個很好的選擇。下面是一個簡單的服務器/客戶機例子,例子很簡單,和java中的網絡編程很相似:


2.urllib和urllib2模塊:這兩個模塊能通過網絡訪問文件,就像那些文件存在於你的電腦上一樣。如果使用簡單的下載功能,urllib就足夠了,如果需要使用HTTP驗證或cookie或者要爲自己的協議寫擴展程序的話,那麼urllib2是個好的選擇。
打開遠程文件:
from urllib import urlopen
webpage=urlopen('http://www.python.org')
如果在線,變量webpage現在應該包含一個鏈接到http://www.python.org網頁的類文件對象。urlopen返回的類文件對象支持close,read,readline和readlines方法,當然也支持迭代。
獲取遠程文件:函數urlopen提供一個能從中讀取數據的類文件對象。如果希望urllib爲你下載文件並在本地文件中存儲一個文件的副本,那麼可以使用urlretrieve。urlretrieve返回一個元組(filename,headers)而不是類文件對象,filename是本地文件的名字(由urllib自動創建),headers包含一些遠程文件的信息。如果想爲下載的副本指定文件名,可以在urlretrieve函數的第二個參數給出。urlretrieve('http://www.python.org','c:\\python_webpage.html')這個語句獲取python的主頁並把它存儲在文件c:\\python_webpage.html中。可以使用urlcleanup函數清理臨時文件,它不需要提供參數。

上面講了兩個常用的模塊,其他的一些網絡相關的模塊如下圖:


3.SocketServer:爲了寫一個使用socketserver框架的服務器,大部分代碼會在一個請求處理程序中,每當服務器收到一個請求時,就會實例化一個請求處理程序,並且它的各種處理方法會在處理請求時被調用。具體調用哪個方法取決於特定的服務器和使用的處理程序類,這樣可以把它們子類化,使得服務器調用自定義的處理程序集。基本的BaseRequestHandler類把所有的操作都放到了處理器的一個叫做handle的方法中,這個方法會被服務器調用。然後這個方法就會訪問屬性self.request中的客戶端套接字。如果是用的是流,那麼可以使用StreamRequestHandler類,創建了其他兩個新屬性,self.rfile(用於讀取)和self.wfile(用於寫入)。然後就能使用這些類文件對象和客戶機進行通信。下面的例子是一個基於SocketServer的小型服務器:


4.使用SocketServer進行分叉和線程處理(windows不支持分叉):

使用分叉技術的服務器:


使用線程處理的服務器:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章