創新從模仿開始!
python中內置的socket模塊使得網絡編程更加簡單化,下面就通過兩個小小腳本來了解客戶端如何與服務器端建立socket。
客戶端代碼:
#clietn.py
if __name__ == '__main__': #判斷是否調用自己本身,如果不是則__name__為腳本名稱
import socket #導入我們所需的socket模塊sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #第一步是創建socket對象。調用socket構造函數 socket = socket.socket( family, type )family參數代表地址家族,可為AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用於同一台機器上的進程間通信。type參數代表套接字類型,可為SOCK_STREAM(流套接字)和SOCK_DGRAM(數據報套接字)
sock.connect(('localhost', 7556)) #使用socket的connect方法連接服務器,需要指定服務器端ip與端口
import time
time.sleep(2)
sock.send('1') #處理階段,客戶和服務器將通過send方法和recv方法通信
print sock.recv(1024)
sock.close() #傳輸結束,客戶通過調用socket的close方法關閉連接。
服務器端代碼:
#server.py
if __name__ == '__main__':
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 7556)) #將socket綁定到指定地址與端口
sock.listen(5) #使用socket套接字的listen方法接收連接請求,括號中參數指定最多允許5個客戶連接到服務器。它的值至少為1。收到連接請求後,這些請求需要排隊,如果隊列滿,就拒絕請求。
while True:
connection,address = sock.accept() #服務器套接字通過socket的accept方法等待客戶請求一個連接。調用accept方法時,socket會時入“waiting”狀態。客戶請求連接時,方法建立連接並返回服務器。accept方法返回一個含有兩個元素的 元組(connection,address)。第一個元素connection是新的socket對象,服務器必須通過它與客戶通信;第二個元素 address是客戶的Internet地址。
try:
connection.settimeout(5) #設置超時時間
buf = connection.recv(1024) #服務器和客戶端通過recv方法通信(傳輸數據)。
調用recv 時,服務器必須指定一個整數,它對應於可通過本次方法調用來接收的最大數據量。recv方法在接收數據時會進入“blocked”狀態,最後返回一個字符 串,用它表示收到的數據。如果發送的數據量超過了recv所允許的,數據會被截短。多余的數據將緩沖於接收端。以後調用recv時,多余的數據會從緩沖區 刪除(以及自上次調用recv以來,客戶可能發送的其它任何數據)。
if buf == '1':
connection.send('welcome to python server!') #服務器調用send,並采用字符串形式向客戶端發送信息。send方法返回已發送的字符個數。
else:
connection.send('please go out!')
except socket.timeout:
print 'time out'
connection.close() #傳輸結束,服務器調用socket的close方法關閉連接。
附:完整代碼
#!/usr/bin/env python
#clietn.py
if __name__ == '__main__':
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 7556))
import time
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()
#!/usr/bin/env python
#server.py
if __name__ == '__main__':
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 7556))
sock.listen(5)
while True:
connection,address = sock.accept()
try:
connection.settimeout(5)
buf = connection.recv(1024)
if buf == '1':
connection.send('welcome to python server!')
else:
connection.send('please go out!')
except socket.timeout:
print 'time out'
connection.close()