python之socket初識

本篇文章主要講的是socket基本操作。包括網絡通信三要素、TCP三次握手以及socket通信流程等。希望感興趣的小夥伴可以堅持看下去同時歡迎提出寶貴的意見讓我們一起進步!

01:OSI模型

1)OSI模型包括應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層這7層。常用的主要是應用層和傳輸層,其餘就不一一介紹。

2)應用層:網絡服務和一些終端的應用。比如HTTP協議、FTP協議

3)傳輸層:定義了一些傳輸數據的協議和端口號。如UDP協議、TCP協議

02:網絡通信三要素(IP地址、端口號、傳輸協議)

1)IP地址:表示網絡上一臺獨立的主機 ; IP地址=網絡地址+主機地址。其中特殊的IP地址:127.0.0.1(本地迴環地址),表示本機

2)端口號:用於標識進程的邏輯地址;不同的進程都有不同的端口標識。

3)傳輸協議:通訊的規則。

①UDP:用戶數據報協議。面向無連接,傳輸數據之前源端和目的端不需要建立連接。如實時在線聊天、視頻會議等

②TCP:傳輸控制協議。面向連接,傳輸數據之前需要建立連接。在連接過程中進行大量數據傳輸,通過“三次握手”的方式完成連接,是安全可靠協議。傳輸速度慢效率低

03:TCP三次握手

1)TCP建立連接時要傳輸三個數據包,俗稱三次握手(Three-way Handshaking)通俗的理解爲:

套接字A:“你好,套接字B,我這裏有數據要傳送給你,建立連接吧。”套接字B:“好的,我這邊已準備就緒。”套接字A:“謝謝你受理我的請求。”

2)三次握手完成,TCP客戶端和服務器端成功地建立連接,可以開始傳輸數據了。

04:socket通信流程

1)創建服務端socket對象。對象創建時,需要綁定它的IP地址(IPv4或Ipv6)和協議(TCP或UDP)。 bind()綁定本機IP地址和端口號,listen()啓動監聽等待客戶端發送的請求。至此服務端建立完成。

2)創建服務端socket對象。根據服務端IP地址和端口號試圖連接服務端socket端。

3)服務端監聽接收accept()到客戶端發送的請求,建立與客戶端的連接connect()。

4)連接建立後,客戶端可以發送send()數據到socket對象中,服務端可以接收recv()到客戶端發送的數據。

5)服務端處理數據後,可以向socket對象返回一個send()處理結果,客戶端讀取recv()到這個返回結

6)客戶端關閉close()連接,客戶端釋放當前佔用的客戶端端口號

7)服務端收到客戶端關閉消息後,關閉與客戶端的連接

05:socket常用方法

1)概述:又稱"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求,使主機間或者一臺計算機上的進程間可以通訊。

2)方法分類:服務端套接字、客戶端套接字、公共用途套接字

①服務端:bind、listen、accept

②客戶端:connet等

③公共端:recv、send、sendall、close等

3)注意事項:socket進入阻塞狀態,即 accept()方法一直等到客戶端返回連接信息後才返回,開始接收下一個客戶端連接請求

06:服務端與客戶端的簡單通信

發送數據:通過bytes類型進行傳輸,需要通過bytes(sendData)轉換

接收數據:通過str類型接收,需要通過str(client_data)轉換

accept():接受並建立與客戶端的連接,程序在此處開始阻塞,只有到客戶端連接起來。


 
#服務端代碼 
import socket 
sk=socket.socket()#創建服務端socket對象 
ip_port=('127.0.0.1',13008)
sk.bind(ip_port)#綁定IP地址和端口號 
sk.listen(5)#開始監聽是否有請求:同時最多允許有5個連接 
print('等待客戶端的連接')#釋放信號 
coon,addr=sk.accept()#連接成功後會返回一個新的套接字和客戶端地址 
print('客戶端新的連接:',addr)

client_data=coon.recv(1024)#接收數據:一次性接收1024字節 
print(str(client_data,encoding='utf8'))
sendData=input('請輸入>>>')

coon.sendall(bytes(sendData,encoding='utf8'))#發送數據 
coon.close()#關閉資源 sk.close()

 
#客戶端代碼 
import socket 
sk=socket.socket()#創建客戶端socket對象 
ip_port=('127.0.0.1',13008)
sk.connect(ip_port)#發起連接 
sendData=input('請輸入>>>')
sk.sendall(bytes(sendData,encoding='utf8'))#發送數據:通過bytes類型進行傳輸 
sever_data=sk.recv(1024)#接收數據:一次性接收1024字節 
print(str(sever_data,encoding='utf8'))#接收數據:通過str類型來接收 
sk.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章