1. 程式人生 > 其它 >PHP網路技術(四)——Socket簡介

PHP網路技術(四)——Socket簡介

PHP網路技術(四)——Socket簡介

(原創內容,轉載請註明來源,謝謝)

Socket又稱為套接字,是作業系統提供的通訊層的API,通過套接字,應用程式可以向網路傳送請求以及應答請求。

一、程序通訊

計算機的每一項工作都在一個程序中,每個程序都有自己的地址範圍,因此需要保證程序互不干擾又可以相互協作。Socket提供程序通訊的解決方法,實現不同主機程序間的相互通訊問題。

同一個主機上,每個程序都有一個獨立的編號,稱為唯一程序號(Process ID)。但是,不同主機之間,Process ID有可能重複,因此需要解決程序號重複的問題。另外,網路上有各種的通訊協議,因此還需要解決不同通訊協議造成的識別問題。

TCP/IP協議為了解決上述問題,引入了網址和埠號。通過網址+埠號,可以具體定位到一臺主機的一個程序。

Socket在網路架構中的位置圖。

Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。

二、Socket程式設計

Socket程式設計分為服務端和客戶端。服務端提供介面和服務,並且開啟後就不斷的監聽客戶端的請求,處理後返回客戶端。客戶端需要主動和服務端建立連線,並且在連線建立以後對服務端開放的介面傳送請求。

服務端可以理解為是一個提供各種服務的資源池,但是不會主動提供服務,當實現socket服務端的程式碼被執行,則開始持續監聽埠,處於待命的狀態。客戶端是可以呼叫服務端提供介面的程式,通過建立連線後,可以執行服務端提供的各種服務。

三、PHP的Socket

PHP的Socket需要在PHP Cli模式下進行,即需要在命令列中執行。

PHP有自帶的函式處理socket,主要有如下幾個。

1、socket_create($domain,$type, $protocol)

該函式用於建立Socket資源(PHP的resource型別變數),其中的引數domain、type和protocol都要求輸入int型別,都有定義好的常量可以呼叫。

domain設定通訊協議,如IPV4、IPV6等,IPV4用常量AF_INET,IPV6用AF_INET6。

type設定socket通訊互動型別,包括全雙工(支援TCP)、半雙工(支援UDP)等。全雙工型別常量是SOCK_STREAM,半雙工型別常量為SOCK_DGRAM。

protocol設定處理型別,包括ICMP、TCP、UDP等,TCP對應的常量是SOL_TCP,UDP是SOL_UDP。

2、socket_bind($socket,$address, $port)

該函式用於將建立的socket資源與特定的IP和埠號繫結。輸入的引數,第一個即由socket_create函式建立的socket resource,第二個和第三個分別是IP和埠號。

3、socket_listen($socket,$backlog=0)

該函式用於服務端監聽客戶端傳送的資料,第一個引數是由socket_create函式建立的socket resource,第二個引數是最大連線數,預設是0。

4、socket_set_block($socket)

該函式將socket設定成非阻塞模式。所謂非阻塞,即當多個客戶端同時傳送請求時,如果其中一個請求耗時很久還沒有返回,則此時可以先處理第二個請求,把第一個請求掛著等有結果再返回。當多個使用者連線時此配置很重要。

5、socket_write($socket,$buffer)

將$buffer的內容寫入到socket中,其中buffer要求是字串。如果需要傳其他內容,如陣列,可以使用serialize或json等方式將資料轉成字串後傳輸。在另一端可以採用相應的方式進行解析。

6、socket_read($socket,$length, $type= PHP_BINARY_READ)

讀取socket的資訊,length為設定的長度,表示讀取length長度的資訊。type預設是PHP_BINARY_READ,表示安全讀取二進位制資料。如果設定成PHP_NORMAL_READ,則遇到r、n、