23 Python指令碼學習筆記二十三網路程式設計

2021-08-10 16:22:38 字數 4271 閱讀 4763

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))

print

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()

print

'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):

print

'got connection from'

, self.transport.client

defconnectionlost(self,reason):

print

self.transport.client,

'disconnected'

defdatareceived(self,data):

print

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...