This commit is contained in:
2023-08-24 11:25:42 +08:00
parent 2ca20d3a96
commit 3c3b6f2e65
+87
View File
@@ -0,0 +1,87 @@
<?php
namespace Kiri;
use Exception;
use Kiri\Di\Context;
use Swoole\Coroutine\Client as CoroutineClient;
use Swoole\Client as AsyncClient;
class TcpClient
{
/**
* @var AsyncClient|CoroutineClient
*/
protected AsyncClient|CoroutineClient $client;
/**
* @param string $host
* @param int $port
* @param int $socket
* @throws Exception
*/
public function __construct(readonly public string $host, readonly public int $port, readonly public int $socket = SWOOLE_SOCK_TCP)
{
$this->reconnect();
}
/**
* @return void
* @throws Exception
*/
public function reconnect(): void
{
$this->client?->close();
if (Context::inCoroutine()) {
$this->client = new CoroutineClient($this->socket);
} else {
$this->client = new AsyncClient($this->socket);
}
if (!$this->client->connect($this->host, $this->port, 1)) {
throw new Exception('Connect ' . $this->host . '::' . $this->port . ' fail');
}
}
/**
* @param string $data
* @return int|bool
*/
public function send(string $data): int|bool
{
return $this->client->send($data);
}
/**
* @return bool|string
*/
public function read(): bool|string
{
return $this->client->recv();
}
/**
* @return bool
*/
public function isConnected(): bool
{
return $this->client->isConnected();
}
/**
* @return bool
*/
public function close(): bool
{
return $this->client->close();
}
}