python網絡編程【二】(使用TCP)


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或更高版本)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM