使用PHP的套接字编程
服务器
<?php
// 设置服务器监听的 IP 和端口
$host = '127.0.0.1'; // 使用本地回环地址
$port = 8080; // 任意未被占用的端口
// 创建 TCP Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die('无法创建 socket: ' . socket_strerror(socket_last_error()));
}
// 绑定 IP 和端口
if (!socket_bind($socket, $host, $port)) {
die('无法绑定地址: ' . socket_strerror(socket_last_error($socket)));
}
// 开始监听
if (!socket_listen($socket)) {
die('无法监听端口: ' . socket_strerror(socket_last_error($socket)));
}
echo "服务器启动,正在监听 {$host}:{$port}...\n";
// 接受客户端连接
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
die('无法接受连接: ' . socket_strerror(socket_last_error($socket)));
}
echo "客户端已连接...\n";
// 要发送的命令字符串
$command = "echo Hello, World!\r\nls -la";
// 解决字符串中的 /r 问题,替换为 /n
$command = str_replace("\r", "", $command);
// 发送命令到客户端
socket_write($clientSocket, $command, strlen($command));
echo "命令已发送到客户端...\n";
// 接收客户端返回的结果
$response = '';
while ($data = socket_read($clientSocket, 1024)) {
$response .= $data;
}
echo "接收到客户端的响应:\n";
echo $response;
// 关闭连接
socket_close($clientSocket);
socket_close($socket);
?>
客户端
<?php
// 设置服务器的 IP 和端口
$host = '127.0.0.1'; // Windows 服务器的 IP 地址
$port = 8080; // 与服务器匹配的端口号
// 创建 TCP Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die('无法创建 socket: ' . socket_strerror(socket_last_error()));
}
// 连接到服务器
if (!socket_connect($socket, $host, $port)) {
die('无法连接服务器: ' . socket_strerror(socket_last_error($socket)));
}
echo "已连接到服务器...\n";
// 从服务器接收命令
$command = '';
while ($chunk = socket_read($socket, 1024)) {
$command .= $chunk;
}
// 解决命令字符串中的 /r 问题
$command = str_replace("\r", "", $command);
echo "接收到的命令: {$command}\n";
// 执行命令并获取输出
exec($command, $output, $return_var);
// 将输出的结果发送回服务器
$result = implode("\n", $output);
socket_write($socket, $result, strlen($result));
// 关闭 socket 连接
socket_close($socket);
?>
运行步骤
-
运行服务器:
- 打开一个终端或命令行窗口,执行
php server.php
。服务器将开始监听来自客户端的连接。
- 打开一个终端或命令行窗口,执行
-
运行客户端:
- 在另一个终端或命令行窗口,执行
php client.php
。客户端将连接到服务器,接收并显示服务器发来的命令。
- 在另一个终端或命令行窗口,执行