Python的Socket知識1:入門
理論知識:
1、TCP/IP協議
計算機產生後,最先是單機互不兼容模式,隨著發展,計算機被一個個的連接起來,形成了一個計算機網路,實現了計算機通信及信息共享,遠距離傳遞信息等工作。互聯的過程就需要一個個協議。
協議就是計算機之間通過網路實現通信時事先達成的一種「約定」;這種「約定」使那些由不同廠商的設備,不同CPU及不同操作系統組成的計算機之間,只要遵循相同的協議就可以實現通信。協議可以分很多種,每一種協議都明確界定了它的行為規範:兩台計算機之間必須能夠支持相同的協議,並且遵循相同的協議進行處理,才能實現相互通信。
互聯網中常用的代表性的協議有IP、TCP、HTTP等,LAN中常用協議有IPX、SPX等
「計算機網路體系結構」將這些網路協議進行了系統的歸納;TCP/IP就是這些協議的集合。
TCP/IP協議(transmission control protocol and internet protocol),傳輸控制協議/網際網路互聯協議,又叫網路通訊協議,是Internet最基本的協議、Internet國際互聯網路的基礎,由網路層的IP協議和傳輸層的TCP協議組成。
TCP/IP 定義了電子設備如何連入網際網路,以及數據如何在它們之間傳輸的標準。協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。通俗而言:TCP負責發現傳輸的問題,一有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。而IP是給網際網路的每一台聯網設備規定一個地址。
2、開放系統互連模型(Open System Interconnection,OSI)。也叫七層參考模型
OSI參考模型它是為了使各層上的協議國際標準化而發展起來的。OSI共有7層,從上到下分別是 7 應用層 6 表示層 5 會話層 4 傳輸層 3 網路層 2 數據鏈路層 1 物理層 ;
其中高層(即7、6、5、4層)定義了應用程序的功能,下面3層(即3、2、1層)主要面向通過網路的端到端的數據流。
在七層模型中,每個分層都接受由它下一層所提供的特定服務,並且負責為自己的上一層提供特定的服務,上下層之間進行交互所遵循的約定叫做「介面」,同一層之間的交互所遵循的約定叫做「協議」。
7層模型介紹:
具體可參考:https://www.cnblogs.com/imyalost/p/6086808.html
3、socket,是在應用層和傳輸層之間的一個抽象層,提供了進程通信的管道,至於傳什麼東西,都是自己定義的。
Socket又稱"套接字"(用於描述IP地址和埠)是一個通信鏈的句柄。應用程序通常通過"套接字"向網路發出請求或者應答網路請求。其實就是一種通信機制。
類似於銀行、電信的電話客戶部門。你打電話時,客戶部門會分配一個專員回答你的問題,客戶部門就相當於socket的伺服器端了,你就相當於客戶端,在和你通話結束前,你無法同其他人通話(同時通話),同樣,客戶部門的電話交換機也不會重複分配。
socket的位置:
socket起源於UNIX,在Unix一切皆文件哲學的思想下,socket是一種"打開—讀/寫—關閉"模式的實現,伺服器和客戶端各自維護一個"文件",在建立連接打開後,可以向自己文件寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉文件。
大概流程是:
客戶端:需要先建立套接字,然後申請連接伺服器,需要知道服務端的ip和埠號,而不需要指定客戶端的(客戶端會由os分配),連接上伺服器後開始讀寫信息,最後關閉套接字。
服務端:建立監聽套接字,綁定地址和埠號,然後開始監聽,等待客戶機連接,生成一個響應套接字,負責處理這個連接請求,然後讀寫信息,關閉響應套接字,關閉監聽套接字。
涉及的參數及流程如下:
用打電話形象比喻整個流程和參數:
伺服器端(收、發消息):
#1買手機
創建socket
s=socket.socket()
#2買手機卡,綁定在手機上
將套接字綁定到地址address(ip地址和埠號)
s.bind("127.0.0.1",9999)
#3開機監聽
打開連接,監聽傳輸鏈接,n為在拒絕連接之前,操作系統可以掛起的最大連接數量,該值至少未1,大部分應用程序設置為5就可以了。
s.listen(5),n為能掛起的鏈接數
#4等待電話,一次只能接聽一個電話。
接收連接請求,並返回conn,address。conn是新建的套接欄位,用來接受和發送數據,相當於連接的那根電話線。address是鏈接客戶端的地址。
conn,addr=s.accept()
#5接電話,收消息
接收客戶端打來電話(消息),1024代表一次性發送多少位元組內容
recv_data=conn.recv(1024)
#6回應消息
send_data=recv_data.upper()
conn.send(send_data)
#7掛電話
關閉套接字
conn.close()
客戶端(發、收消息):
#1買手機
創建socket
s=socket.socket()
#2撥號連接
為socket綁定ip地址和埠號
s.connect("127.0.0.1",9999)
#3發消息
發送消息給伺服器端
send_data=input(">>").strip()
s.send(bytes(send_data,encoding="utf-8"))
#4收消息
接收伺服器端消息
recv_data=s.recv(1024)
print(str(recv_data,encoding="utf-8"))
#6掛電話
conn.close()
案例1:建立簡單socket案例,客服器與客戶端一對一,實現字元轉為大寫。
分別建立伺服器和客戶端程序,每次執行時,需要先運行伺服器程序,再運行客戶端程序。交互一次消息即結束,多次交互需要多次運行伺服器。
1、建立scoket_server伺服器的程序。
#socket_server
#伺服器有收、發的功能,程序運行時需要先運行伺服器,再運行客戶端
#0、導入模塊
importsocket
ip_port=("127.0.0.1",9999)#定義伺服器的ip,9999為埠,埠可以從1024之後的數字寫
#1、創建socket(買手機)
s=socket.socket()#無參數,默認封裝TCP協議
#2、為socket綁定ip地址和和埠號(買手機卡,裝在手機上)
s.bind(ip_port)#參數必須為一個元祖的形式
#3、監聽埠號請求,隨時準備接收客戶端發來的連接(開機等待接電話)
s.listen(5)#參數代表最大掛起5個鏈接,最大接聽5個客戶端,python3.5默認128個
#4、被動等待並接收客戶端連接的請求(等待電話,一次只能聽一個電話)
#accept是一個阻塞的過程,同一時間只能接收一個電話/客戶端,如果有其他的電話進來,就得等待,直到上一個客戶端返回完成連接信息
conn,addr=s.accept()#conn類似於一個客戶端與服務端連接的那根線,每個客戶端都是唯一的,addr是一份地址列表
#5、接收消息(收消息)
recv_data=conn.recv(1024)
#6、修改消息並重新發送消息至客戶端(發消息)
send_data=recv_data.upper()#處理消息,案例的upper為轉成大寫功能
conn.send(send_data)
#7、掛斷
conn.close()
2、建立socket_client客戶端的程序
#socket_client
#客戶端是發和收消息
importsocket
ip_port=("127.0.0.1",9999)
#1、客戶端創建socket(買手機)
s=socket.socket()
#2、根據伺服器ip和埠號試圖發送連接請求給伺服器(撥號)
s.connect(ip_port)
#3、寫入發送的消息(發送消息)
send_data=input(">>").strip()
s.send(bytes(send_data,encoding="utf-8"))#不同於伺服器的地方,這裡用s,而不用conn
#4、接收伺服器返回的消息(接受消息)
recv_data=s.recv(1024)
print(str(recv_data,encoding="utf-8"))#直接把bitys轉變為utf8
#5、掛斷
s.close()
執行結果:
案例2:實現循環多次收發消息。啟動伺服器一次即可,客戶端退出,不影響伺服器。
1、scoket_server伺服器程序。兩層循環:1)一個客戶端斷開,不影響伺服器繼續接收下一個客戶端。2)伺服器斷開或發送空消息,就剖出異常,並繼續等待收消息
#socket_server#伺服器
importsocket
ip_port=("127.0.0.1",8999)
s=socket.socket()
s.bind(ip_port)
s.listen(5)
while True:#一個客戶端退出,伺服器不退出,繼續監聽其他客戶端。
conn,addr=s.accept()#conn是唯一的
while True:
try:
recv_data=conn.recv(1024)
iflen(recv_data)==:break#如果客戶端消息為空,則斷開本次循環,執行close()
send_data=recv_data.upper()
conn.send(send_data)
exceptException:#客戶端斷開的異常處理
break
conn.close()#語句結束後,繼續執行conn,addr=s.accept()
2、socket_client客戶端程序;
#socket_client客戶端
importsocket
ip_port=("127.0.0.1",8999)
s=socket.socket()
s.connect(ip_port)
while True:#用於控制循環調用伺服器
send_data=input("請輸入消息>>").strip()
ifsend_data=="exit":break#控制退出標誌
iflen(send_data)==:continue#控制空消息繼續等待輸入
s.send(bytes(send_data,encoding="utf-8"))
recv_data=s.recv(1024)
print(str(recv_data,encoding="utf-8"))#直接把bitys轉變為utf8
#5、掛斷
s.close()
執行結果:
附:其他知識
1、HTTP協議
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW伺服器傳輸超文本到本地瀏覽器的傳輸協議,所有的WWW文件都必須遵守這個標準。在Internet上的Web伺服器上存放的都是超文本信息。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內容首先顯示(如文本先於圖形)等。
HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。HTTP是一個無狀態的協議。
在TCP/IP協議棧中的位置:
HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。如下圖所示:
默認HTTP的埠號為80,HTTPS的埠號為443。
HTTP的請求響應模型:
HTTP協議是一個無狀態的協議,同一個客戶端的這次請求和上次請求是沒有對應關係.
HTTP協議永遠都是客戶端發起請求,伺服器回送響應。這樣就限制了使用HTTP協議,無法實現在客戶端沒有發起請求的時候,伺服器將消息推送給客戶端。
見下圖:
HTTP工作流程:一次HTTP操作稱為一個事務,其工作過程可分為四步:
※Python開發網路滲透工具以及網站後台爆破,請勿用於非法用途!
※2018完整Python零基礎到項目精通的乾貨學習教程,請你收藏好哦!
TAG:Python |