在 PHP 中,我们可以通过 socket 扩展来创建网络服务程序。其中,socket_accept() 函数是构建基于 TCP 的服务器应用时的关键函数之一。本文将通过一个完整的示例,介绍如何使用 socket_accept() 来实现一个简单的回声服务器(Echo Server)。
socket_accept() 用于接受一个来自客户端的连接请求。这个函数在服务器套接字上阻塞,直到有连接进入。成功时,它返回一个新的套接字资源,该资源可以用来与客户端通信。
语法:
resource socket_accept ( resource $socket )
$socket 是通过 socket_create() 和 socket_bind() 创建并监听的服务器套接字。
返回一个与客户端通信的套接字资源。
下面是创建一个简单回声服务器的完整步骤:
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($server === false) {
die("socket_create() 失败: " . socket_strerror(socket_last_error()) . "\n");
}
$host = '0.0.0.0';
$port = 12345;
if (!socket_bind($server, $host, $port)) {
die("socket_bind() 失败: " . socket_strerror(socket_last_error($server)) . "\n");
}
if (!socket_listen($server, 5)) {
die("socket_listen() 失败: " . socket_strerror(socket_last_error($server)) . "\n");
}
echo "服务器已启动,监听端口 $port ...\n";
while (true) {
$client = socket_accept($server);
if ($client === false) {
echo "socket_accept() 失败: " . socket_strerror(socket_last_error($server)) . "\n";
continue;
}
$msg = "欢迎连接回声服务器!请输入内容,服务器将原样返回。\n";
socket_write($client, $msg, strlen($msg));
while (true) {
$input = socket_read($client, 2048, PHP_NORMAL_READ);
if ($input === false || trim($input) === 'exit') {
break;
}
$input = trim($input);
$output = "你输入了: $input\n";
socket_write($client, $output, strlen($output));
}
socket_close($client);
echo "客户端连接已关闭。\n";
}
当你需要停止服务器时,可以关闭主套接字:
socket_close($server);
你可以使用 Telnet 或者任何支持 TCP 连接的客户端工具连接服务器:
telnet m66.net 12345
连接成功后,服务器会回应欢迎消息,并将你输入的任何内容原样返回。
PHP 的 socket 扩展默认未启用,需在 php.ini 中开启。
本示例为阻塞模式,适合演示和教学用途。在实际生产环境中,建议使用非阻塞模式或借助如 stream_select() 的方式实现多客户端支持。
请确保防火墙和操作系统允许监听的端口通信。
通过 socket_accept(),PHP 可以构建一个基础的 TCP 网络应用。本文实现的回声服务器,是理解 socket 编程机制的良好起点。你可以基于此进一步扩展,实现更复杂的网络服务,如聊天室、远程控制等。
回声服务器示例是 socket 编程中最基础的模型之一,但它为你打开了网络编程的大门。掌握好这些基础,PHP 在网络通信中的潜力将无限拓展。