23. python指令碼學習筆記二十三網路程式設計
本篇名言:「相處時需要包容,相戀時需要真心,爭吵時溝通,孤獨時需要人陪,難過時需要安慰,生氣時需要冷靜,快樂時需要分享。」
python是乙個很強大的網路程式設計工具,因為其內有很多常見網路協議的庫,在庫頂部可以獲得抽象層。讓我們可以集中精力在程式的邏輯處理上,而不是停留在網路實現的細節中。
網路程式設計中的乙個基本元件就是套接字(socket).套接字包括兩個:伺服器套接字和客戶機套接字。
乙個套接字就是乙個socket模組中的socket類的例項。例項化需要3個引數,第乙個引數是位址族,第二個引數是流或資料報套接字,第三個引數是使用的協議。伺服器套接字使用bind方法後,再呼叫listen方法去監聽這個給定的位址。客戶端套接字使用connect方法連線到伺服器。
套接字有兩個方法:send和recv。
看個例項:
伺服器端:
import socket
s =socket.socket()
host =socket.gethostname()
port = 1234
s.bind((host,port))
s.listen(5)
while true:
c, addr = s.accept()
print 'got connection from', addr
c.send('thank you for connecting')
c.close()
客戶機端:
import
socket
s = socket.socket()
host = socket.gethostname()
port =
1234
s.connect((host, port))
s.recv(
1024
)在能使用的各種網路工作庫中,功能最強大的是urllib和urllib2。這個模組能通過網路訪問檔案。兩個模組差不讀哦,不過urllib2更好一些。
通過如下2行**,
from urllib import urlopen
webpage=urlopen(''
)可以獲得網頁的類檔案物件。
使用如下**
from urllib import
urlopen, urlretrieve
urlretrieve(''
,'python_webpage.html'
)將pytohn主頁儲存到python_webapage.html檔案中。
socketserver模組是標準庫中很多伺服器框架的基礎,這些伺服器框架包括basehttpserver,******httpserver,cgihttpserver, ******xmlrpcserver和 docxmlrpcserver等。
通過socketserver來實現剛才的socket,如下:
from
socketserver
import
tcpserver,streamrequesthandler
class
handler(streamrequesthandler):
defhandle(self):
addr = self.request.getpeername()
'got connection from'
, addr
self.wfile.write(
'thank you for connecting')
server = tcpserver((
'',
1234
), handler)
server.serve_forever()
這裡多了乙個請求處理程式handler,每當客戶端有乙個請求時,就會例項化乙個請求處理程式,並且各種處理方法會在處理請求時被呼叫。
之前我們描述的都是一次連線乙個客戶機並處理請求。如何實現同時處理多個連線呢?
可以採用3種主要的方法:分叉(forking),執行緒(threading)以及非同步io(asynchronous i/o)。不過有幾個缺點:1、分叉佔據資源,2、執行緒處理能導致同步問題。
非同步io可以使用select函式來實現,在unix下也可以使用poll函式,poll函式的伸縮性更好,不過只能在unix系統中使用。
select函式實現服務端如下:
import socket, select
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
inputs = [s]
while true:
rs,ws, es = select.select(inputs, , )
for rin rs:
ifr is s:
c, addr = s.accept()
print 'got connection from', addr
else:
try:
data = r.recv(1024)
disconnected = not data
except socket.error:
disconnected = true
if disconnected:
print r.getpeername(), 'disconnected'
inputs.remove(r)
else:
print data
twisted是乙個事件驅動的python網路框架,原來是為網路遊戲開發的,現在被所有型別的網路軟體使用了。
將zope.inte***ce-3.8.0-py2.7-win32.egg放到 c:\python27\scripts目錄下。
在命令列中執行:
c:\>cd python27\scripts
c:\python27\scripts>easy_install.exe zope.inte***ce-3.8.0-py2.7-win32.egg
在socketserver的伺服器有乙個隱式的迴圈,在迴圈中伺服器查詢連線並為每個連線建立乙個處理程式。
使用twisted的簡單伺服器如下:
from
twisted.internet
import
reactor
from
twisted.internet.protocol
import
protocol, factory
class
******logger(protocol):
defconnectionmade(self):
'got connection from'
, self.transport.client
defconnectionlost(self,reason):
self.transport.client,
'disconnected'
defdatareceived(self,data):
data
factory = factory()
factory.protocol = ******logger
reactor.listentcp(
1234
, factory)
reactor.run()
執行兩個客戶端並終端後輸出如下:
gotconnection from ('192.168.1.3', 51942)
gotconnection from ('192.168.1.3', 51961)
('192.168.1.3',51961) disconnected
('192.168.1.3',51942) disconnected
這裡必須例項化factory,還要設定它的protocol屬性,這樣在和客戶機通訊時就知道使用什麼協議。然後在給定的埠處使用工廠進行監聽,這個工廠要通過例項化協議物件來準備處理連線。使用reactor中的listentcp函式來監聽,最後呼叫模組中的run函式啟動伺服器。
(23)python集合的使用
集合是無序可變,元素不能重複。實際上,集合底層是字典實現,集合的所有元素都是字典中的 鍵物件 因此是不能重複的且唯一的。1.使用 建立集合物件,並使用 add 方法新增元素 a a a.add 9 a 2.使用 set 將列表 元組等可迭代物件轉成集合。如果原來資料存在重複資料,則只保留乙個。a a...
2 3 Python資料型別
數值分成三種 整數 浮點數 複數 1 整數 在python中整數都是int型別,無大小限制,可任意大小 如果數字長度過大可以使用下劃線作為分隔符 如 a 123 456 345 a的值為123456345 十進位制的數字不能以0開頭 其他進製的整數,只要是數字列印時一定是以十進位制的形式顯示 二進位...
23 Python常用模組(一)
1.簡單了解模組 寫的每乙個py檔案都是乙個模組.還有一些我們一直在使用的模組 buildins 內建模組.print,input random 主要是和隨機相關的內容 random 隨機小數 uninform a,b 隨機小數 randint a,b 隨機整數 choice 隨機選擇乙個 samp...