1.建立socket
對於一個客戶端程序來說,建立一個socket需要兩個步驟。首先,您需要建立一個實際的socket對象。其次,您需要把它連接到遠程服務器上。
在建立socket對象的時候,您需要告訴系統兩件事:通信類型和協議家族。通信類型指明用什么協議來傳輸數據。協議的例子包括IPv4(當前的Internet標准),IPv6(將來的Internet標准),IPX/SPX(NetWare)和AFP(Apple文件共享)。到目前為止最通用的是IPv4。
協議家族則定義數據如何被傳輸,通信類型基本上都是:AF_INET(和IPv4對應)。協議家族表示TCP通信的SOCK_STREAM和表示UDP通信的SOCK_DGRAM。
對於TCP通信,建立一個socket連接,一般類似這樣的代碼:
1 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
連接socket,您一般需要提供一個tuple(元組),它包含遠程主機或ip地址和端口號。代碼如下:
1 s.connect(("www.baidu.com", 80))
2.尋找端口號
大多數才做系統都會附帶一份端口號列表,Python的socket庫包含一個getservbyname()的函數,它可以自動地查詢。
為了查詢這個列表,您需要兩個參數:協議名和端口號名。端口名是一個字符串,例如:http可以被轉換為一個端口號。
1 #!/usr/bin/env python 2 import socket 3 4 print "Creating socket....." 5 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 6 print "done." 7 8 print "Looking up port number..." 9 port = socket.getservbyname('http','tcp') 10 print "done." 11 12 print "Connecting to remote host on port %d..." % port 13 s.connect(("www.baidu.com",port)) 14 print "done."
運行結果:
3.從socket獲取信息
一旦建立了一個socket連接,您可以從他那里獲取一些有用的信息:
1 #!/usr/bin/env python 2 import socket 3 4 print "Creating socket....." 5 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 6 print "done." 7 8 print "Looking up port number..." 9 port = socket.getservbyname('http','tcp') 10 print "done." 11 12 print "Connecting to remote host on port %d..." % port 13 s.connect(("www.baidu.com",port)) 14 print "done." 15 16 print "Connected from", s.getsockname() 17 print "Connected to ", s.getpeername()
運行結果:
運行這個程序可以看到兩條新的信息。第一條顯示您本身的IP地址和端口號,第二條顯示遠程機器的 IP地址和端口號。對於客戶端來說,端口號是由操作系統分配的,所以,您會發現每次運行程序時,端口號都不一樣。
4.利用socket通信
python提供了兩種方法:socket對象和文件類對象
socket對象提供了操作系統的send(),sendto(),recv()和recvfrom()調用的接口。文件類對象提供了read(),write()和readline()這些更典型的python接口
5.socket異常
1.與一般I/O和通信問題有關的socket.error
2.與查詢地址信息有關的socket.gaierror
3.與其他地址錯誤有關的socket.herror
4.與在一個socket上調用settimeout()后,處理超時有關的socket.timeout(需要python2.3或更高版本)