PHP:PHP實現socket連接

方法介紹(每個方法括號後面跟的是返回類型)

創建一個套接字
socket_create ( int $domain , int $type , int $protocol ) : resource

  • domain 指定哪個協議用在當前套接字上。eg:AF_INET:IPv4 網絡協議
  • type 選擇套接字使用的類型。eg:SOCK_STREAM 提供一個順序化的、可靠的、全雙工的、基於連接的字節流。支持數據傳送流量控制機制。TCP 協議即基於這種流式套接字。
  • protocol 是設置指定 domain 套接字下的具體協議。eg:如果所需的協議是 TCP 或 UDP,可以直接使用常量 SOL_TCP 和 SOL_UDP 。

設置套接字配置信息
socket_set_option ( resource $socket , int $level , int $optname , mixed $optval ): bool

  • socket 使用socket_create()或socket_accept()創建的有效套接字資源
  • level 參數指定選項所在的協議級別.可以使用getprotobyname()獲取對應的level(不理解,大部分文章都說使用SOL_SOCKET)
  • optname 選項名稱。eg:SO_REUSEADDR:報告本地連接是否可用
  • optval 對應選項的值。

綁定地址和端口
socket_bind ( resource $socket , string $address [, int $port = 0 ] ) : bool

  • socket,用 socket_create() 創建的一個有效的套接字資源。
  • address,根據你選定的domain設置綁定地址。eg:如果套接字是 AF_INET 族,那麼 address 必須是一個IP 地址
  • port僅僅用於 AF_INET 套接字連接的時候,並且指定連接中需要監聽的端口號

監聽連接
socket_listen ( resource $socket [, int $backlog= 0 ]): bool

  • socket,使用socket_create() 或socket_addrinfo_bind()創建的有效套接字資源
  • backlog,允許連接數.如果連接請求到達並且隊列已滿,則客戶端可能會收到帶有ECONNREFUSED指示的錯誤 ,或者,如果基礎協議支持重新傳輸,則可以忽略該請求,以便重試可能成功

接收連接socket,會阻塞在這直到有客戶端連接
socket_accept ( resource $socket ) : resource

  • socket,使用socket_create()創建的有效套接字資源

獲取客戶端數據
socket_read ( resource $socket , int $length [, int $type = PHP_BINARY_READ ] ) : string

  • socket,通過 socket_create() or socket_accept()創建的資源.
  • length,讀取的最大字節數,否則你可以使用 \r, \n或\0結束閱讀(取決於type 參數)。
  • type:PHP_BINARY_READ(默認) - 使用系統 recv()函數。安全地讀取二進制數據。PHP_NORMAL_READ- 讀數停在 \ n或\ r \ n。

寫數據到socket中
socket_write ( resource $socket , string $buffer [, int $length = 0 ] ) : int

  • socket,要寫數據的資源連接
  • buffer,要寫的數據
  • length,要寫入數據的長度

完整案例

<?php
/**
 * 描述:下面實現了socket的連接,當注意這不應該被用到正式環境,因爲在性能和穩定性方面還遠遠不夠
 * 使用:命令行模式下,php xxx.php
 */
// 創建一個套接字,使用IPv4網絡協議,TCP方式
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 複用還處於 TIME_WAIT的連接
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1); //複用還處於 TIME_WAIT

// 綁定端口和ip
socket_bind($server, '0.0.0.0','9095');

// 監聽連接
socket_listen($server,1);

// 讓程序一直運行,不然處理完一個請求就會被斷開
while (true){
    // 等待客戶端的連接,如果沒有會一直阻塞在這
    $client = socket_accept($server);
    // 獲取客戶端請求數據
    $buf = socket_read($client,1024);
    response('hello', $client);
    socket_close($client);
}
socket_close($server);

function response($content,$client){

    //返回數據給客戶端,響應處理
    $string="HTTP/1.1 200 OK\r\n";
    $string.="Content-Type: text/html;charset=utf-8\r\n";
    $string.="Content-Length: ".strlen($content)."\r\n\r\n";
    // 注意這裏返回的數據格式要符合協議要求
    socket_write($client,$string.$content);
}

歡迎關注,會同步更新,隨時隨地一起學習
微信公衆號:教練我想學PHP
天天快報、騰訊新聞和QQ瀏覽器:教練我想學PHP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章