PHP Socket 编程实战:服务端与客户端完整示例
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 命令行进行测试:
- 启动服务端:打开 CMD,运行
php server_socket.php。该进程将持续运行并保持监听。 - 启动客户端:新开一个 CMD 窗口,运行
php client_socket.php。
确保 PHP 已加入系统环境变量,或在脚本所在目录下使用绝对路径调用 php 命令。服务端终端应打印出客户端发送的信息,客户端则显示服务端的回显内容。
以上就是 PHP Socket 编程的详细内容,更多关于 PHP 网络开发与后端技术的基础资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









