python核心程式設計筆記 網路程式設計(一)

2021-09-06 13:25:14 字數 2595 閱讀 4164

套接字:通訊端點

. 列印伺服器是硬體伺服器的乙個例子。它們處理傳入的列印作業並將其傳送給系統中的列印裝置。這樣的計算機通常可以通過網路進行訪問,並且客戶端計算機向它傳送列印請求。

另乙個例子是檔案伺服器。這些通常是擁有龐大的儲存容量的計算機,可悲客戶端遠端訪問,支援檔案伺服器的乙個最流行的網路作業系統是sun公司的網路檔案系統(nfs)。它們的目的是讓客戶端訪問網路磁碟和訪問本地磁碟擁有相同的體驗。

. 軟體伺服器也是執行在硬體之上,但是沒有像硬體伺服器那樣的專用外圍裝置。軟體伺服器所提供的主要服務包括程式執行、資料傳輸檢索、聚合、更新或其他型別的程式設計或資料操作。

乙個常見的軟體伺服器是web伺服器。其一般擁有一台或多台計算機,在上面安裝希望提供給使用者的web頁面和web應用程式,然後啟動web伺服器,接受來自客戶端的請求,並向客戶端回送web頁面,然後等待下乙個客戶端的請求。這些伺服器開啟後會盡可能的保持長時間執行,除非受到一些外力驅使(如硬體故障)才會停止。

資料庫伺服器是另一種型別的軟體伺服器。其接受客戶的儲存或是檢索請求,相應請求,然後的等待其它事務。

. 想像客戶端/伺服器架構如何工作的乙個辦法就是在腦海中構建乙個畫面。乙個自動取款機(atm),它服務每乙個排隊的客戶,似乎永遠也不會結束,這個佇列可能很長,也可能空無一人,但在任何給定的某個時刻,都可能會出現乙個客戶。它就像乙個無限迴圈的伺服器,而每乙個客戶就是乙個客戶端,每個客戶端都有乙個需要解決的需求,當atm處理完乙個事務,客戶就會離開,而atm要麼為下個客戶服務,要麼等待下乙個客戶的到來。

. 在伺服器響應客戶端請求之前,需要進行一些初步的設定流程來為之後的工作做準備:**首先會建立乙個通訊端點,**它能夠使伺服器監聽請求,一旦乙個通訊端點已經建立,監聽伺服器就可以進入無限迴圈中,等待客戶端的連線並響應它們的請求。

客戶端比伺服器端更簡單,客戶端需要做的只是建立它的單一通訊端點,然後建立乙個到伺服器的連線。然後客戶端就可以發出請求,該請求包括任何必要的資料交換。一旦請求被伺服器處理,且客戶端收到結果或收到某種確認資訊,此次通訊就會被終止。

. 套接字是計算機網路資料結構,其體現了以上所說的「通訊端點」的概念。在任何型別的通訊開始之前,網路應用程式必須建立套接字。

套接字最初是為同一主機上的應用程式所建立,使得主機上執行的乙個程式和另乙個執行的程式進行通訊(程序間通訊)。有兩種型別的套接字:基於檔案的和面向網路的

所講套接字的第乙個家族是unix套接字,其擁有乙個「家族名字」af_unix(又名af_local),它代表位址家族:unix。包括python之內的大多數受歡迎的平台都使用術語位址家族及其縮寫af。

因為兩個程序執行在同一臺計算機上,所以這些套接字都是基於檔案的,這意味著檔案系統支援它們的底層基礎結構,因為檔案系統是乙個執行在同乙個計算機上的多個程序之間的共享常量。

第二種型別的套接字是面向網路的,它也有自己的家族名字:af_inet,或者位址家族:網際網路。另乙個位址家族af_inet6用於第6版網際網路協議(ipv6)定址。其他還有別的位址家族,但是af_inet是使用的最廣泛的。

. 乙個網路位址由主機名和埠號組成,這是網路通訊所需要的,此外並未事先說明有人在另一端進行接聽,因為可能瀏覽乙個網頁出現「無法連線伺服器」等情況。

有效的埠號範圍是0~65535(儘管小於1024的)。如果正在使用posix相容系統(如linux、mac os x等),那麼可以在/etc/services檔案中找到預留埠號的列表(以及伺服器/協議和套接字型別)。

. 不論採用哪種位址家族,都有兩種不同風格的套接字連線。

. 這種套接字意味著在進行通訊之前需要建立乙個連線,這種型別的連線又稱為虛擬電路流套接字

面向連線的通訊提供序列化的、可靠的和不重複的資料交付,而沒有記錄邊界。這基本上意味著每條訊息可以拆分為多個片段,且每條訊息片段都能確保到達目的地,然後將它們按照順序組合到一起,最後將完整的訊息傳遞給正在等待的應用程式。

實現這種連線型別的主要協議是傳輸控制協議(tcp)。為了建立tcp套接字,必須使用sock_stream作為套接字型別。因為這些套接字的網路版本使用網際網路協議(ip)來搜尋網路中的主機,所以整個系統通常結合這兩種協議來執行。

. 與虛擬電路形成鮮明對比的是資料報型別的套接字,它是一種無連線的套接字。這意味著在通訊開始之前並不需要建立連線。此時,在資料傳輸的過程中並無法保證它的順序性、可靠性或重複性。然而,資料報確實儲存了記錄邊界,這就意味著訊息是以整體傳送的,而並非首先分為多個片段。

這種方式就像是郵政服務,信件和包裹或許並不能以傳送順序到達,事實上可能都不會到達。為了將其新增到併發通訊中,在網路中甚至有可能存在重複的訊息。

既然有這麼多***,那為什麼還要使用資料報呢?這是因為面向連線的套接字所提供的保證導致它們的設定以及對虛擬電路連線的維護需要大量的開銷,而資料報不需要這些開銷。因此它們通常能提供更好的效能,並可能適合一些型別的應用程式。

實現這種連線型別的主要協議是使用者資料報協議(udp),為建立udp套接字,必須使用sock_dgram作為套接字型別(其名字**於單詞「datagram」——資料報)。因為這些套接字也使用網際網路協議來尋找網路中的主機,所以這個系統也有乙個兩種協議的組合名字udp/ip。

Python網路程式設計 Python套接字程式設計

python 提供了兩程式設計客棧個級別訪問的網路服務。低階別的網路服務支援基本的 socket,它提供了標準的 bsd sockets api,可以訪問底層作業系統socket介面的全部方法。高階別的網路服務模組 socketserver,它提供了伺服器中心類,可以簡化網路伺服器的開發。什麼是 s...

Linux UNIX網路程式設計筆記(四) UDP程式設計

udp客戶 伺服器的套接字函式 recvfrom 函式 接收資料,類似標準read include include ssize t recvfrom int sockfd,void buf,size t len,int flags,struct sockaddr from,size t addrle...

linux網路程式設計學習筆記 select程式設計

網路上常見的一張tcp狀態轉換圖,實線是主動端,虛線是被動端 關於select用法 include according to earlier standards include include include int select int nfds,fd set readfds,fd set wri...