feat: 实现TCP Server

This commit is contained in:
zimoyin
2026-03-02 21:59:43 +08:00
parent 043306819b
commit a79dfae57d
144 changed files with 15785 additions and 140 deletions
+110
View File
@@ -0,0 +1,110 @@
<?php
namespace app\process;
use app\flow\FlowMain;
use app\net\PacketContext;
use app\net\parsers\PacketParserFactory;
use app\utils\Logger;
use support\Db;
use support\Log;
use Workerman\Connection\TcpConnection;
class TcpServer
{
/**
* @var array 连接池 map<ip, connection> 连接池,key为客户端IPvalue为连接对象
*/
private static array $connections = [];
public function __construct()
{
// 初始化 FlowMain
FlowMain::getInstance();
}
/**
* 获取连接池
*/
public static function getConnections(): array
{
return self::$connections;
}
/**
* 获取链接
*/
public static function getConnection(string $ip): ?TcpConnection
{
return self::$connections[$ip] ?? null;
}
/**
* 获取所有IP
*/
public static function getAllIp(): array
{
return array_keys(self::$connections);
}
/**
* 获取所有连接
*/
public static function getAllConnections(): array
{
return self::$connections;
}
/**
* Worker启动时触发
*/
public function onWorkerStart($worker): void
{
Logger::info("TcpServer started");
}
/**
* 连接时触发
*/
public function onConnect(TcpConnection $connection): void
{
self::$connections[$connection->getRemoteIp()] = $connection;
Log::info("客户端链接到主机: {$connection->getRemoteIp()}");
}
/**
* 接收数据时触发
*/
public function onMessage(TcpConnection $connection, $data): void
{
$ip = $connection->getRemoteIp();
self::$connections[$ip] = $connection;
$packet = PacketParserFactory::new($data);
$context = new PacketContext(self::getConnections(), $connection, $packet);
// 格式化输出报文信息文本框
Logger::debug(Logger::generateTextBox([
"---------------------------- PACKET --------------------------------",
"IP Address : {$ip}",
"Packet Length: {$packet->length}",
"Hex Packet : {$packet->hexString}",
"Packet Type : {$packet->hexType->name}",
"---------------------------- DATA --------------------------------",
"Reader Info : {$packet->reader}",
"Card Info : {$packet->card}",
"Gateway Info : {$packet->gateway}",
]));
$result = FlowMain::getInstance()->main($context);
$connection->send($result->getFullVoice());
}
/**
* 连接关闭时触发
*/
public function onClose(TcpConnection $connection): void
{
unset(self::$connections[$connection->getRemoteIp()]);
Logger::info("客户端已断开连接:{$connection->getRemoteIp()}");
}
}