在PHP中,利用Socket扩展,我们可以非常灵活地实现网络通信功能,甚至可以用它来打造一个基本的网络服务端。本文将重点讲解如何使用 socket_listen() 和 socket_accept() 函数,构建一个简单的TCP服务器。
socket_listen()
该函数用于监听一个已经绑定了IP和端口的socket资源,等待客户端连接请求。
socket_accept()
该函数用于接受一个进入的客户端连接请求,并返回一个新的socket资源,用于与客户端通信。
创建socket资源(socket_create)
绑定IP和端口(socket_bind)
监听端口(socket_listen)
循环等待并接受客户端连接(socket_accept)
读写数据,完成通信
关闭客户端和服务器端socket
<?php
// 创建TCP socket(AF_INET协议族,流式传输)
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
die("socket_create() 失败: " . socket_strerror(socket_last_error()) . "\n");
}
// 绑定IP和端口
$address = '0.0.0.0'; // 监听所有网络接口
$port = 8080;
if (!socket_bind($server, $address, $port)) {
die("socket_bind() 失败: " . socket_strerror(socket_last_error($server)) . "\n");
}
// 开始监听,允许等待连接的队列长度为5
if (!socket_listen($server, 5)) {
die("socket_listen() 失败: " . socket_strerror(socket_last_error($server)) . "\n");
}
echo "服务器已启动,监听 {$address}:{$port}\n";
while (true) {
// 阻塞等待客户端连接
$client = socket_accept($server);
if ($client === false) {
echo "socket_accept() 失败: " . socket_strerror(socket_last_error($server)) . "\n";
continue;
}
// 从客户端读取数据,最多读取1024字节
$input = socket_read($client, 1024);
if ($input === false) {
echo "socket_read() 失败: " . socket_strerror(socket_last_error($client)) . "\n";
socket_close($client);
continue;
}
echo "收到客户端数据: $input\n";
// 处理数据 - 这里简单回复客户端一个消息
$response = "你好,客户端!你发送的数据是:" . trim($input) . "\n";
socket_write($client, $response, strlen($response));
// 关闭客户端连接
socket_close($client);
}
// 关闭服务器socket(一般不会走到这里)
socket_close($server);
?>
在实际使用中,你可以根据需求对读写逻辑进行扩展,比如实现一个完整的协议解析器,或者异步处理多个客户端。
监听的IP可以设置为具体的地址,或使用 '0.0.0.0' 监听所有可用网络接口。
端口号应避免使用系统保留端口,一般选择1024以上的端口。
以上代码是一个同步阻塞的单线程服务端,适合入门理解。
通过 socket_listen() 和 socket_accept(),PHP能够非常直接地搭建TCP服务端程序,实现基础的网络通信功能。虽然PHP不是专门为高性能服务器设计的语言,但用它快速原型开发小型服务,或者做一些简单的网络交互应用,依然非常实用。
相关标签:
socket_listen