深度好文 簡單易懂,socket再也不是攔路虎

2021-08-26 12:43:53 字數 2604 閱讀 1561

socket在所有程式語言的網路程式設計中都占有了舉足輕重的角色,最基礎也是最重要的角色。而python也為它封裝好了易用也比較完善的語法。

以我們國家的**網路為例,我們想象一下,在現實生活中我們打**的流程是什麼樣子的?

拿起**

撥通號碼(如果不是同一地區,要在號碼前加上區號)

如果對方空閒則接通,如果繁忙則提示「對不起,您撥打的**正在通話中,請稍後再試」

好,現在我們弄清楚了現實中打**的流程,我們對照這個流程來理解一下socket。上面說過socket是程序之間通訊的一種機制。那麼打**的時候,打**的這一方和接**的那一方可以看做是兩個不同的程序。這麼說好理解吧?然後,**號碼中的區號就是socket中的網路位址,**號碼就是socket中的埠號。然後再回頭看通話這個動作,打**的這一方是不是要先撥通**號碼?這個撥打號碼的動作我們可以把它理解為socket的傳送連線請求。如果接**那一方當前是空閒的,那麼它就會接聽**,我們把這個動作看做是接收請求。至此**雙方就實現了通話,這個我們理解為傳輸資料。通話結束以後,一方結束通話**,我們就可以理解為是關閉了socket。

至此,我們就很直觀的理解了,socket實質上提供了程序通訊的端點。在程序通訊之前,雙方必須先建立各自的端點,否則沒有辦法建立連線。就好比要實現通話,你兩個人必須都要有**才行。

根據上面的例子,這一方面就好理解多了。要想實現連線,在socket中分三步走:

1. 伺服器監聽:在伺服器端並不會指定哪乙個具體的客戶端套接字來連線,而是長期處於監聽狀態,誰來請求,它就跟誰連線。

2. 客戶端請求:客戶端的套接字主動提起,並指出要連線伺服器端的套接字位址和埠,然後提出連線請求。

3. 連線確認:當伺服器端接收到這個請求之後,就會確認連線,這個時候就建立了乙個執行緒,然後返回給客戶端乙個確認訊息,客戶端收到這個確認訊息之後一旦認定,那麼他們之間的連線就算建立成功了。

好的,在上面我們搞明白了socket的原理之後,我們來看一下在python中是怎麼玩socket的。在python當中建立套接字必須使用socket.socket()函式。

socket(socket_family,socket_type,protocol=0)

socket_family:

af_unix:基於檔案

af_inet:基於網路ipv4(host,port)

af_inet6:針對ipv6使用的(host, port, flowinfo, scopeid)

socket_type:

sock_stream:有連線的套接字(tcp)

sock_dfram:無連線的套接字(udp)

protocol:

套接字協議

一般使用預設值,在這裡我們暫且不論。

下面我們簡單過下常見的套接字方法:(網上的**,很適合我們現在看)

名稱描述

伺服器套接字方法

s.bind()

將位址(主機名、埠號)繫結到套接字上

s.listen()

設定並啟動tcp***

s.accept()

被動接受tcp客戶端連線,一直等待直到連線到大(阻塞)

客戶端套接字方法

s.connect()

主動發起tcp伺服器連線

s.connect_ex()

connect()的擴充套件版本,此時會以錯誤碼的形式返回問題,而不是丟擲乙個異常

普通的套接字方法

s.recv()

接受tcp訊息

s.recv_into()

接受tcp訊息到指定的緩衝區

s.send()

傳送tcp訊息

a.sendall()

完整的傳送tcp訊息

s.recvfrom()

接受udp訊息

s.recvfrom_into()

接受udp訊息到指定的緩衝區

s.sendto()

傳送udp訊息

s.getpeername()

連線到套接字(tcp)的遠端位址

s.getsockname()

當前套接字的位址

s.getsockopt()

返回給定套接字選項的值

s.setsockopt()

設定給定套接字選項的值

s.shutdown()

關閉連線

s.close()

關閉套接字

s.detach()

在未關閉檔案描述符的情況下關閉套接字,返回檔案描述符

s.ioctl()

控制套接字的模式(僅支援windows)

面向阻塞的套接字方法

s.setbliocking()

設定套接字的阻塞或非阻塞模式

s.settimeout()

設定阻塞套接字操作的超時時間

s.gettiemout()

獲取阻塞台階自操作的超時時間

面向檔案的套接字方法

s.fileno()

套接字的檔案描述符

s.makefile()

建立與套接字關聯的檔案物件

資料屬性

s.family

套接字家族

s.type

套接字型別

s.proto

套接字協議

記憶體布局深度好文

對任何乙個普通c 程式來講,它都會涉及到 5種不同的資料段。常用的幾個資料段種包含有 程式 段 程式資料段 程式堆疊段 等。不錯,這幾種資料段都在其中,但除了以上幾種資料段之外,程序還另外包含兩種資料段。下面我們來簡單歸納一下程序對應的記憶體空間中所包含的 5種不同的資料區。段 段是用來存放可執行檔...

網路基礎好文(通俗易懂系列)

通俗易懂,鏈結 1.cpu是什麼 cpu跑的快 cpu 記憶體 硬碟 速度 cpu沒記性 硬碟 記憶體 cpu 容量 記憶 cpu的小弟 暫存器和程式計數器 cpu工作 讀取記憶體和快取裡的程式 暫存器以迅雷般的速度運輸資料,程式計數器會記錄每一條指令,然後一條一條發給cpu執行。cpu的唯一的記憶...

什麼是Socket 簡單點,通俗易懂的?

網路上的兩個程式通過乙個雙向的通訊連線實現資料的交換,這個連線的一端稱為乙個socket。建立網路通訊連線至少要一對埠號 socket socket本質是程式設計介面 api 對tcp ip的封裝,tcp ip也要提供可供程式設計師做網路開發所用的介面,這就是socket程式設計介面 http是轎車...