TCP 客戶端套接字

建立使用 TCP(傳輸控制協議)的套接字

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

確保已成功建立套接字。onSocketFailure 函式來自本主題中的處理套接字錯誤示例。

if(!is_resource($socket)) onSocketFailure("Failed to create socket");

將套接字連線到指定的地址

如果連線失敗,第二行將正常失敗。

socket_connect($socket, "chat.stackoverflow.com", 6667)
        or onSocketFailure("Failed to connect to chat.stackoverflow.com:6667", $socket);

將資料傳送到伺服器

socket_write 函式通過套接字傳送位元組。在 PHP 中,位元組陣列由字串表示,該字串通常對編碼不敏感。

socket_write($socket, "NICK Alice\r\nUSER alice 0 * :Alice\r\n");

從伺服器接收資料

以下程式碼段使用 socket_read 函式從伺服器接收一些資料。

傳遞 PHP_NORMAL_READ 作為第三個引數讀取直到\r / \n 位元組,並且該位元組包含在返回值中。

相反,傳遞 PHP_BINARY_READ 會從流中讀取所需的資料量。

如果先前呼叫了 socket_set_nonblock,並且使用了 PHP_BINARY_READ,則 socket_read 將立即返回 false。否則,該方法將阻塞,直到接收到足夠的資料(達到第二個引數的長度,或到達行結尾),或者套接字被關閉。

此示例從所謂的 IRC 伺服器讀取資料。

while(true) {
    // read a line from the socket
    $line = socket_read($socket, 1024, PHP_NORMAL_READ);
    if(substr($line, -1) === "\r") {
        // read/skip one byte from the socket
        // we assume that the next byte in the stream must be a \n.
        // this is actually bad in practice; the script is vulnerable to unexpected values
        socket_read($socket, 1, PHP_BINARY_READ);
    }

    $message = parseLine($line);
    if($message->type === "QUIT") break;
}

關閉套接字

關閉套接字會釋放套接字及其相關資源。

socket_close($socket);