咱們知道兩個進程若是須要進行通信最基本的一個前提可以惟一的標識一個進程,在本地進程通信中咱們可使用PID來惟一標識一個進程,但PID只在本地惟一,網絡中的兩個進程PID衝突概率很大,這時候咱們須要另闢它徑了,咱們知道IP層的ip地址能夠惟一標識主機,而TCP層協議和端口號能夠惟一標識主機的一個進程,這樣咱們能夠利用ip地址+協議+端口號惟一標識網絡中的一個進程。html
可以惟一標示網絡中的進程後,它們就能夠利用socket進行通訊了,什麼是socket呢?咱們常常把socket翻譯爲套接字,socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操做抽象爲幾個簡單的接口供應用層調用以實現進程在網絡中通訊。python
說了這麼多,是否是沒聽懂,不要緊,咱們直接上代碼:web
import socket def main(): # 實例化socket對象 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #默認鏈接是tcp,ip 爲ipv4,默承認以簡寫爲: sock = socket.socket() # 監聽ip端口 sock.bind(('127.0.0.1',8080)) # 設置客戶端最大鏈接數 sock.listen(5) while True: #循環時會等待客戶端發來請求,直到有請求鏈接才執行下面的方法 print '.... waiting client connect ....' connection, address = sock.accept() #connection,address 分別表明客戶端socket,客戶端IP地址 #接受客戶端發來的信息 client_data = connection.recv(1024) print client_data #注意:接受和發送的頻率必須保持一次,不然阻塞 connection.send("HTTP/1.1 200 OK\r\n\r\n") connection.send('Hello, World') #關閉服務端與client的鏈接 connection.close() if __name__ == '__main__': main()
服務端執行:
python socket_demo.py瀏覽器
執行結果:服務器
.... waiting client connect .... GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 RA-Ver: 3.0.7 RA-Sid: .... waiting client connect .... GET /favicon.ico HTTP/1.1 Host: localhost:8080 Connection: keep-alive User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36 Accept: */* Referer: http://localhost:8083/ Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 RA-Ver: 3.0.7 RA-Sid: .... waiting client connect ....
客戶端執行:(經過瀏覽器執行)網絡
http://localhost:8080/ #執行結果: Hello, World
是否是模擬了現實的https請求,socket server做爲web,瀏覽器做爲客戶端與之進行交互!app
咱們來看看socket server 、client 底層是如何實現的:框架
socket_server.pysocket
import socket #實例化socket對象 sock_server = socket.socket() #監聽ip端口 (ip端口,元組形式傳入) sock_server.bind(('127.0.0.1',8082)) #最大鏈接數 sock_server.listen(5) while True: print "start waiting client connetcion ...." connection,address = sock_server.accept() #accept 會阻塞 connection.send('服務端發送過來的數據') client_data = sock_server.recv(1024) print client_data #服務端端口與客戶端的鏈接 connection.close() #這裏端開的是與客戶端的連接 注意:若是寫成這樣:sock_server.close() 這個是端口服務器,至關於down機
socket_client.pytcp
import socket ]#實例化socket對象 sock_client = socket.socket() #鏈接服務端端 ,請注意:這裏和服務端有點不同,同時傳入 ip端口,須是元組 sock_client.connect(('127.0.0.1',8082)) #發數據給服務端端 sock_client.send('send data from client') #接受服務端發來的數據 server_data = sock_client.recv(1024) #當收發不相等時,recv 會阻塞 print server_data #關閉與服務端的鏈接 sock_client.close()
持續更新中....