python socket編程

python 編寫server的步驟:

   1.

      第一步是建立socket對象。調用socket構造函數。如:

      socket = socket.socket( family, type )

      family參數表明地址家族,可爲AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用於同一臺機器上的進程間通訊。
      type參數表明套接字類型,可爲SOCK_STREAM(流套接字)和SOCK_DGRAM(數據報套接字)。
   2.

      第二步是將socket綁定到指定地址。這是經過socket對象的bind方法來實現的:

      socket.bind( address )



      由AF_INET所建立的套接字,address地址必須是一個雙元素元組,格式是(host,port)。host表明主機,port表明端口號。若是端口號正在使用、主機名不正確或端口已被保留,bind方法將引起socket.error異常。
   3.

      第三步是使用socket套接字的listen方法接收鏈接請求。

      socket.listen( backlog )

      backlog指定最多容許多少個客戶鏈接到服務器。它的值至少爲1。收到鏈接請求後,這些請求須要排隊,若是隊列滿,就拒絕請求。
   4.

      第四步是服務器套接字經過socket的accept方法等待客戶請求一個鏈接。

      connection, address = socket.accept()

      調 用accept方法時,socket會時入「waiting」狀態。客戶請求鏈接時,方法創建鏈接並返回服務器。accept方法返回一個含有兩個元素的 元組(connection,address)。第一個元素connection是新的socket對象,服務器必須經過它與客戶通訊;第二個元素 address是客戶的Internet地址。
   5. 第五步是處理階段,服務器和客戶端經過send和recv方法通訊(傳輸 數據)。服務器調用send,並採用字符串形式向客戶發送信息。send方法返回已發送的字符個數。服務器使用recv方法從客戶接收信息。調用recv 時,服務器必須指定一個整數,它對應於可經過本次方法調用來接收的最大數據量。recv方法在接收數據時會進入「blocked」狀態,最後返回一個字符 串,用它表示收到的數據。若是發送的數據量超過了recv所容許的,數據會被截短。多餘的數據將緩衝於接收端。之後調用recv時,多餘的數據會從緩衝區 刪除(以及自上次調用recv以來,客戶可能發送的其它任何數據)。
   6. 傳輸結束,服務器調用socket的close方法關閉鏈接。

python編寫client的步驟:

   1. 建立一個socket以鏈接服務器:socket = socket.socket( family, type )
   2.

      使用socket的connect方法鏈接服務器。對於AF_INET家族,鏈接格式以下:

      socket.connect( (host,port) )

      host表明服務器主機名或IP,port表明服務器進程所綁定的端口號。如鏈接成功,客戶就可經過套接字與服務器通訊,若是鏈接失敗,會引起socket.error異常。
   3. 處理階段,客戶和服務器將經過send方法和recv方法通訊。
   4. 傳輸結束,客戶經過調用socket的close方法關閉鏈接。

下面給個簡單的例子:

server.py
python 代碼
  1. if __name__ == '__main__':  
  2.     import socket  
  3.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  4.     sock.bind(('localhost', 8001))  
  5.     sock.listen(5)  
  6.     while True:  
  7.         connection,address = sock.accept()  
  8.         try:  
  9.             connection.settimeout(5)  
  10.             buf = connection.recv(1024)  
  11.             if buf == '1':  
  12.                 connection.send('welcome to server!')  
  13.             else:  
  14.                 connection.send('please go out!')  
  15.         except socket.timeout:  
  16.             print 'time out'  
  17.         connection.close()  
複製代碼
client.py
python 代碼
  1. if __name__ == '__main__':  
  2.     import socket  
  3.     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
  4.     sock.connect(('localhost', 8001))  
  5.     import time  
  6.     time.sleep(2)  
  7.     sock.send('1')  
  8.     print sock.recv(1024)  
  9.     sock.close()  
複製代碼
在 終端運行server.py,而後運行clien.py,會在終端打印「welcome to server!"。若是更改client.py的sock.send('1')爲其它值在終端會打印」please go out!「,更改time.sleep(2)爲大於5的數值, 服務器將會超時。
相關文章
相關標籤/搜索