當前位置:
首頁 > 最新 > Python的Socket知識1:入門

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 的精彩文章:

Python開發網路滲透工具以及網站後台爆破,請勿用於非法用途!
2018完整Python零基礎到項目精通的乾貨學習教程,請你收藏好哦!

TAG:Python |