只要和網絡服務涉及的,就離不開Socket以及Socket編程,下面就說說Python Socket通訊的基本原理。
python
1.Socket編程
socket也稱做「套接字」,用於描述IP地址和端口,是一個通訊鏈的句柄。應用程序一般經過「套接字」向網絡發出請求或者應答網絡請求。能夠列舉中國移動或者是中國電信等的電話客服,固然,也能夠看下面的圖片來做形象的說明。
服務器
socket起源於Unix,而Unix/Linux基本哲學之一就是:一切皆文件,即均可以用「打開open—>讀寫write/read—>關閉close」模式來操做。Socket就是該模式的一個實現,socket便是一種特殊的文件,一些socket函數就是對其進行的操做(讀/寫IO、打開、關閉)。
網絡
能夠看下面的圖示來形象說明:
socket
2.Socket編程ide
(1)Socket服務器編程函數
主要包括下面的幾步:spa
1.打開socket線程
2.綁定到一個地址和端口orm
3.偵聽進來的鏈接
4.接受鏈接
5.讀寫數據
(2)Socket客戶端編程
主要包括下面的幾步:
1.打開socket
2.鏈接到一個地址和端口
3.讀寫數據
3.Socket類型
Socket從類型上分,能夠有如下幾種:
socket類型 | 適用範圍 | 說明 |
socket.AF_UNIX | 只可以用於單一的Unix系統進程間通訊 | 不能在不一樣主機之間通訊 |
socket.AF_INET | 服務器之間網絡通訊 | 目前經常使用的就是這種 |
socket.AF_INET6 | IPv6 | 因爲IPv6未推廣,也少用 |
上面是socket的類型,細分的話還有socket的數據包類型,圖示以下:
經常使用的是第一種和第二種,即for TCP和for UDP的類型,固然socket.SOCK_RAW也須要注意,由於它能夠構造IP頭,所以沿着這個思路,能夠合僞造不一樣源IP地址的數據包,以對一些中小型企業服務器發動Dos***。
4.Socket函數
對socket進行相關操做如「讀/寫IO、打開、關閉」的函數便是Socket函數,能夠看下面的圖示:
只須要記住經常使用的就能夠,即一般會在Server端和Client端中編程會用到的,能夠見下面的例子。
5.Socket例子
下面就寫一個單線程非交互式的socket,在本機裏實現通訊就行了。
Server端:
import socket #導入socket類 HOST ='' #定義偵聽本地地址口(多個IP地址狀況下),這裏表示偵聽全部,也能夠寫成0.0.0.0 PORT = 50007 #Server端開放的服務端口 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #選擇Socket類型和Socket數據包類型 s.bind((HOST, PORT)) #綁定IP地址和端口 s.listen(1) #定義偵聽數開始偵聽(實際上並無效果) conn, addr = s.accept() #定義實例,accept()函數的返回值能夠看上面的socket函數說明 print 'Connected by', addr while 1: data = conn.recv(1024) #接受套接字的數據 if not data:break #若是沒有數據接收,則斷開鏈接 print 'revc:',data #發送接收到的數據 conn.sendall(data) #發送接收到的數據 conn.close() #關閉套接字
Client端:
import socket HOST = '192.168.1.13' #定義目標主機名 PORT = 50007 #定義目標主機開放服務端口號 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #選擇Socket類型和Socket數據包類型 s.connect((HOST, PORT)) #鏈接到目標主機的socket(套接字)中 s.sendall('Hello, world!') #發送數據 data = s.recv(1024) #接收數據 s.close() #關閉socket print 'Received', repr(data)
演示:
步驟1:Server端運行服務端程序
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python server4.py ===>光標在此到處於等待狀態
步驟2:Client端運行客戶端程序
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py Received 'Hello, world! ===>收到服務端返回的數據
步驟3:在Server端中觀察現象
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python server4.py Connected by ('192.168.1.13', 52641) ===>有客戶端鏈接進來,52641爲Client的隨機端口號 revc: Hello, world! ===>收到來自Client端的數據