- 論壇徽章:
- 0
|
基本的 Python socket 模塊
Python 提供了兩個(gè)基本的 socket 模塊。第一個(gè)是 Socket,它提供了標(biāo)準(zhǔn)的 BSD Sockets API。第二個(gè)是
SocketServer
,它提供了服務(wù)器中心類,可以簡(jiǎn)化網(wǎng)絡(luò)服務(wù)器的開(kāi)發(fā)。Python 使用一種異步的方式來(lái)實(shí)現(xiàn)這種功能,您可以提供一些插件類來(lái)處理服務(wù)器中應(yīng)用程序特有的任務(wù)。表 1 列出了本節(jié)所涉及的類和模塊。
類/模塊
說(shuō)明
Socket
低層網(wǎng)絡(luò)接口(每個(gè) BSD API)
SocketServer
提供簡(jiǎn)化網(wǎng)絡(luò)服務(wù)器開(kāi)發(fā)的類
讓我們來(lái)看一下這些模塊,以便理解它們是如何工作的。
socket 模塊
Socket 模塊提供了 UNIX 程序員所熟悉的基本網(wǎng)絡(luò)服務(wù)(也稱為 BSD API)。這個(gè)模塊中提供了在構(gòu)建 socket 服務(wù)器和客戶機(jī)時(shí)所需要的所有功能。
這個(gè) API 與標(biāo)準(zhǔn)的 C API 之間的區(qū)別在于它是面向?qū)ο蟮。在C中,socket描述符是從socket調(diào)用中獲得的,然后會(huì)作為一個(gè)參數(shù)傳遞給BSD API函數(shù)。在Python中,socket 方法會(huì)向應(yīng)用socket方法的對(duì)象返回一個(gè)socket對(duì)象。表2給出了幾個(gè)類方法,表3顯示了一部分實(shí)例方法。
類方法
說(shuō)明
Socket
低層網(wǎng)絡(luò)接口(每個(gè) BSD API)
socket.socket(family, type)
創(chuàng)建并返回一個(gè)新的 socket 對(duì)象
socket.getfqdn(name)
將使用點(diǎn)號(hào)分隔的 IP 地址字符串轉(zhuǎn)換成一個(gè)完整的域名
socket.gethostbyname(hostname)
將主機(jī)名解析為一個(gè)使用點(diǎn)號(hào)分隔的 IP 地址字符串
socket.fromfd(fd, family, type)
從現(xiàn)有的文件描述符創(chuàng)建一個(gè) socket 對(duì)象
實(shí)例方法
說(shuō)明
sock.bind( (adrs, port) )
將 socket 綁定到一個(gè)地址和端口上
sock.accept()
返回一個(gè)客戶機(jī) socket(帶有客戶機(jī)端的地址信息)
sock.listen(backlog)
將 socket 設(shè)置成監(jiān)聽(tīng)模式,能夠監(jiān)聽(tīng) backlog 外來(lái)的連接請(qǐng)求
sock.connect( (adrs, port) )
將 socket 連接到定義的主機(jī)和端口上
sock.recv( buflen[, flags] )
從 socket 中接收數(shù)據(jù),最多 buflen 個(gè)字符
sock.recvfrom( buflen[, flags] )
從 socket 中接收數(shù)據(jù),最多 buflen 個(gè)字符,同時(shí)返回?cái)?shù)據(jù)來(lái)源的遠(yuǎn)程主機(jī)和端口號(hào)
sock.send( data[, flags] )
通過(guò) socket 發(fā)送數(shù)據(jù)
sock.sendto( data[, flags], addr )
通過(guò) socket 發(fā)送數(shù)據(jù)
sock.close()
關(guān)閉 socket
sock.getsockopt( lvl, optname )
獲得指定 socket 選項(xiàng)的值
sock.setsockopt( lvl, optname, val )
設(shè)置指定 socket 選項(xiàng)的值
類方法和實(shí)例方法之間的區(qū)別在于,實(shí)例方法需要有一個(gè)socket實(shí)例(從socket返回)才能執(zhí)行,而類方法則不需要。
SocketServer 模塊
SocketServer
模塊是一個(gè)十分有用的模塊,它可以簡(jiǎn)化socket服務(wù)器的開(kāi)發(fā)。有關(guān)這個(gè)模塊的使用的討論已經(jīng)遠(yuǎn)遠(yuǎn)超出了本教程的范圍,但是我將展示一下它的基本用法,然后您可以參閱參考資料一節(jié)中給出的鏈接。
考慮清單 2 中給出的例子。此處,我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的 “Hello World” 服務(wù)器,當(dāng)客戶機(jī)連接它時(shí),它就會(huì)顯示這樣一條消息。我首先創(chuàng)建一個(gè)請(qǐng)求處理程序,它繼承了
SocketServer
.
StreamRequestHandler
類。我們定義了一個(gè)名為 handle 的方法,它處理服務(wù)器的請(qǐng)求。服務(wù)器所做的每件事情都必須在這個(gè)函數(shù)的上下文中進(jìn)行處理(最后,關(guān)閉這個(gè) socket)。這個(gè)過(guò)程的工作方式非常簡(jiǎn)單,但是您可以使用這個(gè)類來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 HTTP 服務(wù)器。在 handle 方法中,我們打一個(gè)招呼就退出了。
現(xiàn)在連接處理程序已經(jīng)準(zhǔn)備就緒了,剩下的工作是創(chuàng)建 socket 服務(wù)器。我們使用了
SocketServer
.TCPServer 類,并提供了地址和端口號(hào)(要將服務(wù)器綁定到哪個(gè)端口上)以及請(qǐng)求處理方法。結(jié)果是一個(gè) TCPServer 對(duì)象。調(diào)用 serve_forever 方法啟動(dòng)服務(wù)器,并使其對(duì)這個(gè)連接可用。
Toggle line numbers
Toggle line numbers
1 import SocketServer
2
3 class hwRequestHandler( SocketServer.StreamRequestHandler ):
4 def handle( self ):
5 self.wfile.write("Hello World!\n")
6
7
8 server = SocketServer.TCPServer( ("", 2525), hwRequestHandler )
9 server.serve_forever()
就是這樣!Python 允許這種機(jī)制的任何變種,包括 UDPServers 以及派生進(jìn)程和線程的服務(wù)器。請(qǐng)參閱 參考資料一節(jié)中更多信息的鏈接。
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/60332/showart_2127355.html |
|