歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python Socket通訊例子詳解

創新從模仿開始!
 
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()

Copyright © Linux教程網 All Rights Reserved