摘要:在這個時刻,服務(wù)程序被驚醒并且為客戶提供服務(wù)對客戶的請求作出適當(dāng)?shù)姆磻?yīng)。為了方便這種模型的網(wǎng)絡(luò)編程,年代初,由聯(lián)合了其他幾家公司共同制定了一套下的網(wǎng)絡(luò)編程接口,即規(guī)范,它不是一種網(wǎng)絡(luò)協(xié)議而是一套開放的支持多種協(xié)議的下的網(wǎng)絡(luò)編程接口。
這篇文章將會介紹一下 Socket 編程中相關(guān)的 PHP 函數(shù),并簡單實現(xiàn)一個 C/S 的交互Socket 簡介
Socket 的官方解釋:
在網(wǎng)絡(luò)編程中最常用的方案便是Client/Server(客戶機(jī)/服務(wù)器)模型。在這種方案中客戶應(yīng)用程序向服務(wù)器程序請求服務(wù)。一個服務(wù)程序通常在一個眾所周知的地址監(jiān)聽對服務(wù)的請求,也就是說,服務(wù)進(jìn)程一 直處于休眠狀態(tài),直到一個客戶向這個服務(wù)的地址提出了連接請求。在這個時刻,服務(wù)程序被"驚醒"并且為客戶提供服務(wù)-對客戶的請求作出適當(dāng)?shù)姆磻?yīng)。為了方便這種Client/Server模型的網(wǎng)絡(luò)編程,90年代初,由Microsoft聯(lián)合了其他幾家公司共同制定了一套WINDOWS下的網(wǎng)絡(luò)編程接口,即WindowsSockets規(guī)范,它不是一種網(wǎng)絡(luò)協(xié)議,而是一套開放的、支持多種協(xié)議的Windows下的網(wǎng)絡(luò)編程接口。現(xiàn)在的Winsock已經(jīng)基本上實現(xiàn)了與協(xié)議無關(guān),你可以使用Winsock來調(diào)用多種協(xié)議的功能,但較常使用的是TCP/IP協(xié)議。Socket實際在計算機(jī)中提供了一個通信端口,可以通過這個端口與任何一個具有Socket接口的計算機(jī)通信。應(yīng)用程序在網(wǎng)絡(luò)上傳輸,接收的信息都通過這個Socket接口來實現(xiàn)
我們可以簡單的把 Socket 理解為一個可以連通網(wǎng)絡(luò)上不同計算機(jī)應(yīng)用程序之間的管道,把一堆數(shù)據(jù)從管道的 A 端扔進(jìn)去,則會從管道的 B 端(同時還可以從C、D、E、F……端冒出來)。
注意:我們會在不同語境下使用不同的詞語去修飾 socket,你只需要對它有個概念就好了,因為 socket 本身就沒有真正意義上的實體
Socket 函數(shù)介紹Socket 通信依次會進(jìn)行 Socket 創(chuàng)建、 Socket 綁定、Socket 監(jiān)聽、Socket 收發(fā)、Socket 關(guān)閉幾個階段,下面我們列舉出 PHP 網(wǎng)絡(luò)編程中最常用也是必不可少的幾個常用的函數(shù)進(jìn)行進(jìn)一步的說明。
socket_createTODO : 創(chuàng)建一個新的 socket 資源
函數(shù)原型: resource socket_create ( int $domain , int $type , int $protocol )
它包含三個參數(shù),分別如下:
domain:AF_INET、AF_INET6、AF_UNIX,AF的釋義就 address family,地址族的意思,我們常用的有 ipv4、ipv6
type: SOCK_STREAM、SOCK_DGRAM等,最常用的就是SOCK_STREAM,基于字節(jié)流的SOCKET類型,也是TCP協(xié)議使用的類型
protocol: SOL_TCP、SOL_UDP 這個就是具體使用的傳輸協(xié)議,一般可靠的傳輸我們選擇 TCP,游戲數(shù)據(jù)傳輸我們一般選用 UDP 協(xié)議
socket_bindTODO : 將創(chuàng)建的 socket 資源綁定到具體的 ip 地址和端口
函數(shù)原型: bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )
它包含三個參數(shù),分別如下:
socket: 使用socket_create創(chuàng)建的 socket 資源,可以認(rèn)為是 socket 對應(yīng)的 id
address: ip 地址
port: 監(jiān)聽的端口號,WEB 服務(wù)器默認(rèn)80端口
socket_listenTODO : 在具體的地址下監(jiān)聽 socket 資源的收發(fā)操作
函數(shù)原型: bool socket_listen ( resource $socket [, int $backlog = 0 ] )
它包含兩個個參數(shù),分別如下:
socket: 使用socket_create創(chuàng)建的socket資源
backlog: 等待處理連接隊列的最大長度
socket_acceptTODO : 監(jiān)聽之后,接收一個即將來臨的新的連接,如果連接建立成功,將返回一個新的 socket 句柄(你可以理解為子進(jìn)程,通常父進(jìn)程用來接收新的連接,子進(jìn)程負(fù)責(zé)具體的通信)
函數(shù)原型: resource socket_accept ( resource $socket )
socket: 使用socket_create創(chuàng)建的socket資源
socket_writeTODO : 將指定的數(shù)據(jù)發(fā)送到 對應(yīng)的 socket 管道
函數(shù)原型: int socket_write ( resource $socket , string $buffer [, int $length ] )
socket: 使用socket_create創(chuàng)建的socket資源
buffer: 寫入到socket資源中的數(shù)據(jù)
length: 控制寫入到socket資源中的buffer的長度,如果長度大于buffer的容量,則取buffer的容量
socket_readTODO : 獲取傳送的數(shù)據(jù)
函數(shù)原型: int socket_read ( resource $socket , int $length )
socket: 使用socket_create創(chuàng)建的socket資源
length: socket資源中的buffer的長度
socket_closeTODO : 關(guān)閉 socket 資源
函數(shù)原型: void socket_close ( resource $socket )
socket: socket_accept或者socket_create產(chǎn)生的資源,不能用于stream資源的關(guān)閉
stream_socket_server由于創(chuàng)建一個SOCKET的流程總是 socket、bind、listen,所以PHP提供了一個非常方便的函數(shù)一次性創(chuàng)建、綁定端口、監(jiān)聽端口
函數(shù)原型: resource stream_socket_server ( string $local_socket [, int &$errno [, string &$errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )
local_socket: 協(xié)議名://地址:端口號
errno: 錯誤碼
errstr: 錯誤信息
flags: 只使用該函數(shù)的部分功能
context: 使用stream_context_create函數(shù)創(chuàng)建的資源流上下文
socket 實現(xiàn) C/S 交互基于上面的函數(shù)我們可以很方便的去構(gòu)建 socket 通信程序(在這里我希望讀者能多帶帶建立一個目錄比如socket 因為后續(xù)我們還會建立很多文件)我們先編輯一個服務(wù)端程序 server.php,如下:
再編輯一個客戶端程序client.php,如下:
然后我們打開終端(命令行)進(jìn)入文件目錄下依次執(zhí)行:
php server.php php client.php
運行效果如下:
注意服務(wù)器監(jiān)聽時進(jìn)程是掛起的不能進(jìn)行其他操作,你可能需要另起一個終端執(zhí)行客戶端程序
Socket 編程入門結(jié)語本篇文章就是為大家整理了一下 PHP Socket 編程常用的函數(shù)并解釋了一下各自的意義,然后寫了一個簡單的 C/S 交互,希望大家對網(wǎng)絡(luò)編程有個比較直觀的認(rèn)識,下篇文章我會簡單講講進(jìn)程在網(wǎng)絡(luò)編程中的作用,這也是為后面網(wǎng)絡(luò)模型的講解打個基礎(chǔ)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29118.html
摘要:這跟國內(nèi)文化學(xué)習(xí)路徑編程意識都有關(guān)系,當(dāng)然還有一個重要原因就是沒有比較詳盡的資料無從下手,那么通過這系列文章我希望小白能夠走近網(wǎng)絡(luò)編程。 我們應(yīng)該要明白一點:但凡涉及網(wǎng)絡(luò)的事務(wù),一定要經(jīng)過網(wǎng)絡(luò)的各個層次,PHP程序員可能更多地是在服務(wù)端的應(yīng)用層打交道很少接觸應(yīng)用層下面的傳輸層、網(wǎng)絡(luò)層。這跟國內(nèi) PHP文化、學(xué)習(xí)路徑、編程意識都有關(guān)系,當(dāng)然還有一個重要原因就是沒有比較詳盡的資料無從下手,...
摘要:網(wǎng)絡(luò)編程就是如何在程序中實現(xiàn)兩臺計算機(jī)的通信。而網(wǎng)絡(luò)編程最終要開發(fā)出來的應(yīng)用大多數(shù)為支持各種協(xié)議的服務(wù)器,比如服務(wù)器服務(wù)器或者是基于自定義的協(xié)議實現(xiàn)的服務(wù)。在開始編碼之前,首先介紹一下協(xié)議棧上圖是我從網(wǎng)絡(luò)編程這本書拍下來的。 相信大部分的初中級PHP程序員平時寫的業(yè)務(wù)代碼占絕大多數(shù),寫厭了平時的增刪改查,何不體驗體驗網(wǎng)絡(luò)編程的魅力呢。 學(xué)習(xí)網(wǎng)絡(luò)編程能夠很好的理解一些底層的網(wǎng)絡(luò)通信,比如...
閱讀 1639·2021-10-14 09:43
閱讀 5577·2021-09-07 10:21
閱讀 1292·2019-08-30 15:56
閱讀 2139·2019-08-30 15:53
閱讀 1245·2019-08-30 15:44
閱讀 2022·2019-08-30 15:44
閱讀 1334·2019-08-29 17:24
閱讀 764·2019-08-29 15:19