一步一步實現HTTP伺服器-C/S伺服器框架結構
概述
繼上一篇XmlRPC簡介及使用對PRC做了個簡單介紹,其實RPC就是網路編程的一個實際應用,不過上次從上層講解,可能還不能很好的理解一個簡單Client/Server(客戶端/伺服器,後面簡稱C/S)網路通信框架,本次就使用Pyhthon來說明一個完整的Socket伺服器通信的框架,同時本文先從TCP進行講解(具體TCP和UDP系列後面進行細說)。
本文主要從以下幾個方面進行闡述:
伺服器和客戶端通信簡單介紹
Socket函數簡介
服務端代碼實現
客戶端代碼實現
通過以上4個步驟,對網路編程有個簡單理解,方便後文層層深入作鋪墊
Socket簡介
Socket(套接字)是計算機網路數據結構,在任何類型的通信開始之前,網路應用程序都必須創建套接字。就類似於網線兩端的水晶頭,如果沒得這個東西無法建立連接。Socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象為幾個簡單的介面供應用層調用已實現進程在網路中通信。 Socket起源於UNIX,在Unix一切皆文件哲學的思想下,Socket是一種"打開—讀/寫—關閉"模式的實現,伺服器和客戶端各自維護一個"文件"(如果客戶端和伺服器在同一台機器上,進行進程間通信,可以是一個文件句柄;如果在網路上這個就相對複雜些),在建立連接打開後,可以向自己文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。
套接字編程API
通用套接字方法
socket(family=AFINET, type=SOCKSTREAM, proto=0)#創建套接字
recv(buffersize, flags=None)#接收TCP消息
send(data, flags=None)#發送TCP消息
服務端套接字方法
bind(address)#將地址(主機名、埠號)綁定到套接字上
listen(backlog=None)#監聽埠
accept()#阻塞等待客戶端的連接(被動接收客戶端連接)
客戶端套接字方法
connect(address)#連接伺服器指定埠(主動發起TCP連接)
Socket通信路程圖
服務端
既然是C/S模型,那麼首先得先說說Server端,一般伺服器的框架如下:
創建伺服器socket套接字
套接字與地址綁定(此處地址為ip:port)
監聽埠
伺服器進入循環階段(一般都是死循環,因為要提供持續服務)
開始接受客戶端的連接
此時就開始進行消息的接收和發送
關閉客戶端socket套接字
關閉伺服器socket套接字(次數一般都不會執行,因為是死循環嘛,除非捕獲異常)
基於上面幾個步驟,此處使用Python代碼進行實現時間戳伺服器
通過再命令行運行python timestampeServer.py程序即可
客戶端
對於客戶端稍微簡單點:
創建客戶端socket套接字
嘗試連接伺服器
發送/接收數據
關閉客戶端套接字
通過再命令行運行python Client.py程序即可
歡迎關注交流共同進步
TAG:奔跑阿甘 |