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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章