PHP Socket 编程实战:服务端与客户端完整示例

向北走
向北走
发布时间:2026-10-13| 3人浏览过
原创

PHP Socket 编程涉及创建网络服务的客户端与服务端。本文通过解析核心函数如 socket_create、bind、listen 等,并提供完整的服务端与客户端 PHP 代码示例,帮助开发者理解 TCP 连接的建立、数据传输及断开过程。

Socket 编程核心概念

Socket 编程本质上是建立一个基于网络协议的通信通道,类似于 MySQL 的客户端与服务端架构,但 Socket 需要开发者手动构建应用层逻辑。其核心流程包括服务端的监听接收和客户端的连接发起。

核心函数解析

进行 Socket 编程前,需掌握以下关键函数及其参数含义:

第1步:创建套接字 (socket_create)

socket_create($domain, $type, $protocol) 用于创建通信节点。

  • $domain: 协议族,常用 AF_INET (IPv4) 或 AF_INET6 (IPv6)。
  • $type: 传输方式,SOCK_STREAM 代表 TCP(可靠连接),SOCK_DGRAM 代表 UDP(无连接)。
  • $protocol: 具体协议,如 SOL_TCP 或 SOL_UDP。

第2步:绑定端口 (socket_bind)

socket_bind($socket, $address, $port) 将套接字绑定到指定 IP 和端口,是服务端必要步骤。

第3步:监听连接 (socket_listen)

socket_listen($socket, $backlog) 启动监听队列,$backlog 指定最大排队连接数。

第4步:接受连接 (socket_accept)

socket_accept($socket) 阻塞等待客户端连接,成功返回新的套接字资源,用于后续与该特定客户端通信。

第5步:数据读写 (socket_read & socket_write)

  • socket_read($socket, $length): 从套接字读取数据,返回字符串。
  • socket_write($socket, $msg, $length): 向套接字写入数据,返回写入字节数。

其他辅助函数

  • socket_close($socket): 关闭套接字连接。
  • socket_set_option($socket, $level, $optname, $optval): 设置套接字选项,如超时时间。SOL_SOCKET 配合 SO_RCVTIMEO(接收超时)或 SO_SNDTIMEO(发送超时),值通常为数组 ['sec' => 秒, 'usec' => 微秒]。
  • socket_last_error($socket) 和 socket_strerror($code): 获取并转换错误码为可读信息。

服务端实现示例

服务端脚本 server_socket.php 负责持续监听指定端口,接受请求并回显信息。注意执行顺序必须为 bind → listen → accept。

<?php
// 创建 IPv4 TCP 套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 绑定本地 IP 和端口 8888
if(socket_bind($socket, '127.0.0.1', 8888) == false){
    echo 'Server bind fail: ' . socket_strerror(socket_last_error());
}

// 开始监听,最多排队 4 个连接
if(socket_listen($socket, 4) == false){
    echo 'Server listen fail: ' . socket_strerror(socket_last_error());
}

echo "Server waiting for connections...\n";

// 无限循环处理连接
do {
    // 接受客户端连接
    $accept_resource = socket_accept($socket);

    if ($accept_resource !== false) {
        // 读取客户端发送的数据,最大 1024 字节
        $string = socket_read($accept_resource, 1024);

        if ($string !== false) {
            echo 'Server received: ' . trim($string) . PHP_EOL;
            
            // 构建回复消息
            $return_client = 'Received: ' . trim($string) . PHP_EOL;
            
            // 发送回复给客户端
            socket_write($accept_resource, $return_client, strlen($return_client));
        }

        // 关闭当前客户端连接
        socket_close($accept_resource);
    }
} while (true);

socket_close($socket);
?>

客户端实现示例

客户端脚本 client_socket.php 负责连接服务端,发送消息并接收响应。建议设置超时以避免永久阻塞。

<?php
// 创建 TCP 套接字
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 设置接收超时时间为 1 秒
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
// 设置发送超时时间为 6 秒
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 6, "usec" => 0));

// 连接服务端
if(socket_connect($socket, '127.0.0.1', 8888) == false){
    echo 'Connect fail: ' . socket_strerror(socket_last_error());
} else {
    $message = 'l love you 我爱你 socket';
    
    // 处理中文编码,转换为 GBK 以防乱码
    $message = mb_convert_encoding($message, 'GBK', 'UTF-8');

    // 发送消息
    if(socket_write($socket, $message, strlen($message)) == false){
        echo 'Write fail: ' . socket_strerror(socket_last_error());
    } else {
        echo 'Client write success' . PHP_EOL;
        
        // 循环读取服务端返回的消息,直到断开
        while($callback = socket_read($socket, 1024)){
            echo 'Server return message is:' . PHP_EOL . $callback;
        }
    }
}

socket_close($socket);
?>

测试与运行方法

在 Windows 环境下,可通过 CMD 命令行进行测试:

  1. 启动服务端:打开 CMD,运行 php server_socket.php。该进程将持续运行并保持监听。
  2. 启动客户端:新开一个 CMD 窗口,运行 php client_socket.php。

确保 PHP 已加入系统环境变量,或在脚本所在目录下使用绝对路径调用 php 命令。服务端终端应打印出客户端发送的信息,客户端则显示服务端的回显内容。

以上就是 PHP Socket 编程的详细内容,更多关于 PHP 网络开发与后端技术的基础资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。