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);