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