php 实现 tcp
PHP 实现 TCP 通信的方法
使用 socket 扩展
PHP 的 socket 扩展提供了 TCP 通信的功能。以下是一个简单的 TCP 服务器和客户端的实现示例。
TCP 服务器示例
$host = '127.0.0.1';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Server listening on $host:$port\n";
while (true) {
$client = socket_accept($socket);
$message = socket_read($client, 1024);
echo "Received: $message\n";
socket_write($client, "Message received", strlen("Message received"));
socket_close($client);
}
socket_close($socket);
TCP 客户端示例
$host = '127.0.0.1';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, $host, $port);
$message = "Hello, Server!";
socket_write($socket, $message, strlen($message));
$response = socket_read($socket, 1024);
echo "Server response: $response\n";
socket_close($socket);
使用 stream_socket 函数
PHP 的 stream_socket 函数族也支持 TCP 通信,提供了更高层次的抽象。
TCP 服务器示例
$host = '127.0.0.1';
$port = 12345;
$server = stream_socket_server("tcp://$host:$port", $errno, $errstr);
if (!$server) {
die("Error: $errstr ($errno)");
}
echo "Server listening on $host:$port\n";
while ($client = stream_socket_accept($server)) {
$message = fread($client, 1024);
echo "Received: $message\n";
fwrite($client, "Message received");
fclose($client);
}
fclose($server);
TCP 客户端示例
$host = '127.0.0.1';
$port = 12345;
$client = stream_socket_client("tcp://$host:$port", $errno, $errstr);
if (!$client) {
die("Error: $errstr ($errno)");
}
$message = "Hello, Server!";
fwrite($client, $message);
$response = fread($client, 1024);
echo "Server response: $response\n";
fclose($client);
使用第三方库
对于更复杂的 TCP 通信需求,可以考虑使用第三方库,如 ReactPHP 或 Workerman。这些库提供了事件驱动的异步 TCP 通信能力。
ReactPHP 示例
require 'vendor/autoload.php';
$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server('127.0.0.1:12345', $loop);
$socket->on('connection', function (React\Socket\ConnectionInterface $connection) {
$connection->write("Hello from server!\n");
$connection->on('data', function ($data) use ($connection) {
echo "Received: $data";
$connection->write("Message received\n");
});
});
echo "Server listening on 127.0.0.1:12345\n";
$loop->run();
Workerman 示例
require_once 'vendor/autoload.php';
use Workerman\Worker;
$worker = new Worker('tcp://127.0.0.1:12345');
$worker->onConnect = function($connection) {
echo "New connection\n";
};
$worker->onMessage = function($connection, $data) {
echo "Received: $data\n";
$connection->send("Message received\n");
};
$worker->onClose = function($connection) {
echo "Connection closed\n";
};
Worker::runAll();
注意事项
- 确保 PHP 已安装
socket扩展,可通过php -m | grep socket检查。 - 防火墙设置可能阻止 TCP 通信,确保端口已开放。
- 异步 TCP 通信需要额外的库支持,如
ReactPHP或Workerman。
以上方法提供了不同层次的 TCP 通信实现,可根据具体需求选择适合的方式。







