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 代碼
- if __name__ == '__main__':
- import socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.bind(('localhost', 8001))
- sock.listen(5)
- while True:
- connection,address = sock.accept()
- try:
- connection.settimeout(5)
- buf = connection.recv(1024)
- if buf == '1':
- connection.send('welcome to server!')
- else:
- connection.send('please go out!')
- except socket.timeout:
- print 'time out'
- connection.close()
複製代碼
client.py
python 代碼
- if __name__ == '__main__':
- import socket
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect(('localhost', 8001))
- import time
- time.sleep(2)
- sock.send('1')
- print sock.recv(1024)
- sock.close()
複製代碼
在 終端運行server.py,而後運行clien.py,會在終端打印「welcome to server!"。若是更改client.py的sock.send('1')爲其它值在終端會打印」please go out!「,更改time.sleep(2)爲大於5的數值, 服務器將會超時。