Socket 的官方解釋:
在網絡編程中最常用的方案便是Client/Server(客戶機/服務器)模型。在這種方案中客戶html' target='_blank'>應用程序向服務器程序請求服務。一個服務程序通常在一個眾所周知的地址監聽對服務的請求,也就是說,服務進程一 直處于休眠狀態,直到一個客戶向這個服務的地址提出了連接請求。在這個時刻,服務程序被 驚醒 并且為客戶提供服務-對客戶的請求作出適當的反應。為了方便這種Client/Server模型的網絡編程,90年代初,由Microsoft聯合了其他幾家公司共同制定了一套WINDOWS下的網絡編程接口,即WindowsSockets規范,它不是一種網絡協議,而是一套開放的、支持多種協議的Windows下的網絡編程接口?,F在的Winsock已經基本上實現了與協議無關,你可以使用Winsock來調用多種協議的功能,但較常使用的是TCP/IP協議。Socket實際在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有Socket接口的計算機通信。應用程序在網絡上傳輸,接收的信息都通過這個Socket接口來實現
我們可以簡單的把 Socket 理解為一個可以連通網絡上不同計算機應用程序之間的管道,把一堆數據從管道的 A 端扔進去,則會從管道的 B 端(同時還可以從C、D、E、F……端冒出來)。
注意:我們會在不同語境下使用不同的詞語去修飾 socket,你只需要對它有個概念就好了,因為 socket 本身就沒有真正意義上的實體
Socket 函數介紹Socket 通信依次會進行 Socket 創建、 Socket 綁定、Socket 監聽、Socket 收發、Socket 關閉幾個階段,下面我們列舉出 PHP 網絡編程中最常用也是必不可少的幾個常用的函數進行進一步的說明。
socket_createTODO : 創建一個新的 socket 資源
函數原型: resource socket_create ( int $domain , int $type , int $protocol )
它包含三個參數,分別如下:
domain:AF_INET、AF_INET6、AF_UNIX,AF的釋義就 address family,地址族的意思,我們常用的有 ipv4、ipv6
type: SOCK_STREAM、SOCK_DGRAM等,最常用的就是SOCK_STREAM,基于字節流的SOCKET類型,也是TCP協議使用的類型
protocol: SOL_TCP、SOL_UDP 這個就是具體使用的傳輸協議,一般可靠的傳輸我們選擇 TCP,游戲數據傳輸我們一般選用 UDP 協議
socket_bindTODO : 將創建的 socket 資源綁定到具體的 ip 地址和端口
函數原型: bool socket_bind ( resource $socket , string $address [, int $port = 0 ] )
它包含三個參數,分別如下:
socket: 使用socket_create創建的 socket 資源,可以認為是 socket 對應的 id
address: ip 地址
port: 監聽的端口號,WEB 服務器默認80端口
socket_listenTODO : 在具體的地址下監聽 socket 資源的收發操作
函數原型: bool socket_listen ( resource $socket [, int $backlog = 0 ] )
它包含兩個個參數,分別如下:
socket: 使用socket_create創建的socket資源
backlog: 等待處理連接隊列的最大長度
socket_acceptTODO : 監聽之后,接收一個即將來臨的新的連接,如果連接建立成功,將返回一個新的 socket 句柄(你可以理解為子進程,通常父進程用來接收新的連接,子進程負責具體的通信)
函數原型: resource socket_accept ( resource $socket )
socket: 使用socket_create創建的socket資源
socket_writeTODO : 將指定的數據發送到 對應的 socket 管道
函數原型: int socket_write ( resource $socket , string $buffer [, int $length ] )
socket: 使用socket_create創建的socket資源
buffer: 寫入到socket資源中的數據
length: 控制寫入到socket資源中的buffer的長度,如果長度大于buffer的容量,則取buffer的容量
socket_readTODO : 獲取傳送的數據
函數原型: int socket_read ( resource $socket , int $length )
socket: 使用socket_create創建的socket資源
length: socket資源中的buffer的長度
socket_closeTODO : 關閉 socket 資源
函數原型: void socket_close ( resource $socket )
socket: socket_accept或者socket_create產生的資源,不能用于stream資源的關閉
stream_socket_server由于創建一個SOCKET的流程總是 socket、bind、listen,所以PHP提供了一個非常方便的函數一次性創建、綁定端口、監聽端口
函數原型: resource stream_socket_server ( string $local_socket [, int $errno [, string $errstr [, int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN [, resource $context ]]]] )
local_socket: 協議名://地址:端口號
errno: 錯誤碼
errstr: 錯誤信息
flags: 只使用該函數的部分功能
context: 使用stream_context_create函數創建的資源流上下文
socket 實現 C/S 交互基于上面的函數我們可以很方便的去構建 socket 通信程序(在這里我希望讀者能單獨建立一個目錄比如socket 因為后續我們還會建立很多文件)我們先編輯一個服務端程序 server.php,如下:
?phpdate_default_timezone_set( Asia/Shanghai error_reporting(E_NOTICE );/* 確保在連接客戶端時不會超時 */set_time_limit(0);$ip = 127.0.0.1 $port = 8090; +------------------------------- * @socket通信整個過程 +------------------------------- * @socket_create * @socket_bind * @socket_listen * @socket_accept * @socket_read * @socket_write * @socket_close +--------------------------------/*---------------- 以下操作都是手冊上的 -------------------*/if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) 0) { echo socket_create() Why failure is: .socket_strerror($sock). /n if(($ret = socket_bind($sock,$ip,$port)) 0) { echo socket_bind() Why failure is: .socket_strerror($ret). /n if(($ret = socket_listen($sock,4)) 0) { echo socket_listen() Why failure is: .socket_strerror($ret). /n echo Start time: .date( Y-m-d H:i:s ) . PHP_EOL;echo Listening at .$ip. : .$port.PHP_EOL;
if (($msgsock = socket_accept($sock)) 0) { echo socket_accept() failed: reason: . socket_strerror($msgsock) . /n break; } else { # 連接成功輸出 Socket id $i = (int)$msgsock; echo welcome client $i # 向客戶端通信(反饋) $msg = 連接成功!/n socket_write($msgsock, $msg, strlen($msg)); socket_close($msgsock);} while (true);socket_close($sock);?
再編輯一個客戶端程序client.php,如下:
?php
* @socket_connect:客戶端發起套接字連接 * @param socket resource $socket 創建的$socket資源 * @param address string SOCK_STREAM IP地址|Unix套接字 * @param port int 端口 * @socket_create:創建并返回一個套接字 * @param domain string AF_INET IPV4 網絡協議 * @param type string SOCK_STREAM 全雙工字節流(可用的套接字類型) * @param protocol string SOL_TCP 具體協議(IPV4下的TCP協議) * @param return 套接字$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);if ($socket 0) { echo socket_create() failed: reason: . socket_strerror($socket) . /n }else { echo try to connect $ip port: $port .../n
$result = socket_connect($socket, $ip, $port); #socket_connect的返回值應該是boolean值if ($result 0) { echo socket_connect() failed./nReason: ($result) . socket_strerror($result) . /n }else { # 連接成功輸出提示信息 echo connect successfully/n # 向服務端發送數據 socket_write($socket, hello , 1024); # 獲取服務端數據 $result = socket_read($socket, 1024); echo 服務器回傳數據為: . $result;
獨孤九賤(5)_ThinkPHP5視頻教程ThinkPHP是國內最流行的中文PHP開發框架,也是您Web項目的最佳選擇。《VeVb.com獨孤九賤(5)-ThinkPHP5視頻教程》課程以ThinkPHP5最新版本為例,從最基本的框架常識開始,將...
Peter-Zhu 2017-05-16 12:03:57
獨孤九賤(4)_PHP視頻教程江湖傳言:PHP是世界上最好的編程語言。真的是這樣嗎?這個梗究竟是從哪來的?學會本課程,你就會明白了。PHP 出品的PHP入門系統教學視頻,完全從初學者的角度出發,絕不玩虛的,一切以實用、有用...
Peter-Zhu 2017-03-20 22:47:17
獨孤九賤(1)_HTML5視頻教程《VeVb.com原創html5視頻教程》課程特色:php 原創幽默段子系列課程,以惡搞,段子為主題風格的php視頻教程!輕松的教學風格,簡短的教學模式,讓同學們在不知不覺中,學會了HTML知識。...
Peter-Zhu 2017-03-13 10:15:11
ThinkPHP5實戰之[教學管理系統]本套教程,以一個真實的學校教學管理系統為案例,手把手教會您如何在一張白紙上,從零開始,一步一步的用ThinkPHP5框架快速開發出一個商業項目。
Peter-Zhu 2017-07-24 16:48:56
PHP入門視頻教程之一周學會PHP所有計算機語言的學習都要從基礎開始,《PHP入門視頻教程之一周學會PHP》不僅是PHP的基礎部分更主要的是PHP語言的核心技術,是學習PHP必須掌握的內容,任何PHP項目的實現都離不開這部分的內容,通...
PHP教程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答