This commit is contained in:
2021-08-03 14:06:47 +08:00
parent 5fc88d3076
commit 2ebb787b74
6 changed files with 69 additions and 138 deletions
+3
View File
@@ -10,6 +10,7 @@ use Snowflake\Abstracts\Config;
use Snowflake\Event; use Snowflake\Event;
use Snowflake\Exception\ConfigException; use Snowflake\Exception\ConfigException;
use Snowflake\Snowflake; use Snowflake\Snowflake;
use Swoole\Server\Port;
/** /**
@@ -26,6 +27,8 @@ abstract class Server
protected Event $_event; protected Event $_event;
abstract public function bindCallback(\Swoole\Server|Port $server, ?array $settings = []);
/** /**
+9 -20
View File
@@ -46,32 +46,21 @@ class HTTPServerListener extends Abstracts\Server
/** /**
* UDPServerListener constructor. * UDPServerListener constructor.
* @param Server|\Swoole\WebSocket\Server|\Swoole\Http\Server $server * @param Server|Port $server
* @param string $host
* @param int $port
* @param int $mode
* @param array|null $settings * @param array|null $settings
* @return Server\Port * @return Server\Port
* @throws ReflectionException * @throws ReflectionException
* @throws Exception * @throws Exception
*/ */
public static function instance(mixed $server, string $host, int $port, int $mode, ?array $settings = []): Server\Port public function bindCallback(Server|Port $server, ?array $settings = []): Server\Port
{ {
if (!in_array($mode, [SWOOLE_TCP, SWOOLE_TCP6])) { $this->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null);
trigger_error('Port mode ' . $host . '::' . $port . ' must is udp listener type.');
} $server->set(array_merge($settings['settings'] ?? [], ['enable_unsafe_event' => false]));
/** @var static $reflect */ $server->on('request', [$this, 'onRequest']);
$reflect = Snowflake::getDi()->getReflect(static::class)?->newInstance(); $server->on('connect', [$this, 'onConnect']);
$reflect->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null); $server->on('close', [$this, 'onClose']);
static::$_http = $server->addlistener($host, $port, $mode); return $server;
if (!(static::$_http instanceof Port)) {
trigger_error('Port is ' . $host . '::' . $port . ' must is tcp listener type.');
}
static::$_http->set(array_merge($settings['settings'] ?? [], ['enable_unsafe_event' => false]));
static::$_http->on('request', [$reflect, 'onRequest']);
static::$_http->on('connect', [$reflect, 'onConnect']);
static::$_http->on('close', [$reflect, 'onClose']);
return static::$_http;
} }
+21 -48
View File
@@ -226,25 +226,22 @@ class ServerManager extends Abstracts\Server
* @param int $mode * @param int $mode
* @param array $settings * @param array $settings
* @throws ReflectionException * @throws ReflectionException
* @throws NotFindClassException * @throws Exception
*/ */
private function addNewListener(string $type, string $host, int $port, int $mode, array $settings = []) private function addNewListener(string $type, string $host, int $port, int $mode, array $settings = [])
{ {
echo sprintf("\033[36m[" . date('Y-m-d H:i:s') . "]\033[0m $type service %s::%d start.", $host, $port) . PHP_EOL; echo sprintf("\033[36m[" . date('Y-m-d H:i:s') . "]\033[0m $type service %s::%d start.", $host, $port) . PHP_EOL;
switch ($type) { /** @var Server\Port $service */
case Constant::SERVER_TYPE_TCP: $this->ports[$port] = $this->server->addlistener($host, $port, $mode);
$this->ports[$port] = TCPServerListener::instance($this->server, $host, $port, $mode, $settings); $this->ports[$port]->set($settings['settings'] ?? []);
break; $reflect = match ($type) {
case Constant::SERVER_TYPE_UDP: Constant::SERVER_TYPE_TCP => Snowflake::getDi()->getReflect(TCPServerListener::class),
$this->ports[$port] = UDPServerListener::instance($this->server, $host, $port, $mode, $settings); Constant::SERVER_TYPE_UDP => Snowflake::getDi()->getReflect(UDPServerListener::class),
break; Constant::SERVER_TYPE_HTTP => Snowflake::getDi()->getReflect(HTTPServerListener::class),
case Constant::SERVER_TYPE_HTTP: Constant::SERVER_TYPE_WEBSOCKET => Snowflake::getDi()->getReflect(WebSocketServerListener::class),
$this->ports[$port] = HTTPServerListener::instance($this->server, $host, $port, $mode, $settings); default => throw new Exception(''),
break; };
case Constant::SERVER_TYPE_WEBSOCKET: $reflect->newInstance()->bindCallback($this->ports[$port], $settings['events'] ?? []);
$this->ports[$port] = WebSocketServerListener::instance($this->server, $host, $port, $mode, $settings);
break;
}
} }
@@ -326,6 +323,7 @@ class ServerManager extends Abstracts\Server
* @param array $settings * @param array $settings
* @throws NotFindClassException * @throws NotFindClassException
* @throws ReflectionException * @throws ReflectionException
* @throws Exception
*/ */
private function addDefaultListener(string $type, array $settings): void private function addDefaultListener(string $type, array $settings): void
{ {
@@ -334,46 +332,21 @@ class ServerManager extends Abstracts\Server
$this->addTaskListener($settings['events']); $this->addTaskListener($settings['events']);
} }
if ($type === Constant::SERVER_TYPE_WEBSOCKET) { if ($type === Constant::SERVER_TYPE_WEBSOCKET) {
/** @var WebSocketServerListener $reflect */
$reflect = $this->getNewInstance(WebSocketServerListener::class); $reflect = $this->getNewInstance(WebSocketServerListener::class);
$this->server->on('handshake', [$reflect, 'onHandshake']); $reflect->bindCallback($this->server, $settings);
$this->server->on('message', [$reflect, 'onMessage']);
$this->server->on('connect', [$reflect, 'onConnect']);
if (isset($settings['events'][Constant::REQUEST])) {
$request = $this->getNewInstance(HTTPServerListener::class);
if (is_array($settings['events'][Constant::REQUEST])) {
$settings['events'][Constant::REQUEST][0] = $this->getNewInstance($settings['events'][Constant::REQUEST][0]);
}
$this->server->on('request', $settings['events'][Constant::REQUEST] ?? [$request, 'onRequest']);
}
$reflect->setEvents(Constant::HANDSHAKE, $settings['events'][Constant::HANDSHAKE] ?? null);
$reflect->setEvents(Constant::MESSAGE, $settings['events'][Constant::MESSAGE] ?? null);
$reflect->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null);
} else if ($type === Constant::SERVER_TYPE_UDP) { } else if ($type === Constant::SERVER_TYPE_UDP) {
/** @var UDPServerListener $reflect */
$reflect = $this->getNewInstance(UDPServerListener::class); $reflect = $this->getNewInstance(UDPServerListener::class);
$this->server->on('packet', [$reflect, 'onPacket']); $reflect->bindCallback($this->server, $settings);
$reflect->setEvents(Constant::PACKET, $settings['events'][Constant::PACKET] ?? null);
} else if ($type === Constant::SERVER_TYPE_HTTP) { } else if ($type === Constant::SERVER_TYPE_HTTP) {
/** @var HTTPServerListener $reflect */
$reflect = $this->getNewInstance(HTTPServerListener::class); $reflect = $this->getNewInstance(HTTPServerListener::class);
$this->server->on('request', [$reflect, 'onRequest']); $reflect->bindCallback($this->server, $settings);
$this->server->on('connect', [$reflect, 'onConnect']);
$this->server->on('close', [$reflect, 'onClose']);
$reflect->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null);
$reflect->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null);
} else { } else {
/** @var TCPServerListener $reflect */
$reflect = $this->getNewInstance(TCPServerListener::class); $reflect = $this->getNewInstance(TCPServerListener::class);
$this->server->on('connect', [$reflect, 'onConnect']); $reflect->bindCallback($this->server, $settings);
$this->server->on('close', [$reflect, 'onClose']);
$this->server->on('receive', [$reflect, 'onReceive']);
$reflect->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null);
$reflect->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null);
$reflect->setEvents(Constant::RECEIVE, $settings['events'][Constant::RECEIVE] ?? null);
}
if ($this->server instanceof WServer && swoole_version() >= '4.7') {
$reflect->setEvents(Constant::DISCONNECT, $settings['events'][Constant::DISCONNECT] ?? null);
$this->server->on('disconnect', [$reflect, 'onDisconnect']);
} }
} }
+10 -27
View File
@@ -5,8 +5,6 @@ namespace Server;
use Exception; use Exception;
use ReflectionException; use ReflectionException;
use Snowflake\Event; use Snowflake\Event;
use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
use Swoole\Server; use Swoole\Server;
use Swoole\Server\Port; use Swoole\Server\Port;
@@ -25,37 +23,22 @@ class TCPServerListener extends Abstracts\Server
/** /**
* UDPServerListener constructor. * UDPServerListener constructor.
* @param Server $server * @param Server|Port $server
* @param string $host
* @param int $port
* @param int $mode
* @param array|null $settings * @param array|null $settings
* @return Port * @return Port
* @throws NotFindClassException
* @throws ReflectionException
* @throws Exception * @throws Exception
*/ */
public static function instance(Server $server, string $host, int $port, int $mode, ?array $settings = []): Port public function bindCallback(Server|Port $server, ?array $settings = []): Port
{ {
if (!in_array($mode, [SWOOLE_TCP, SWOOLE_TCP6])) { $this->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null);
trigger_error('Port mode ' . $host . '::' . $port . ' must is tcp listener type.'); $this->setEvents(Constant::RECEIVE, $settings['events'][Constant::RECEIVE] ?? null);
} $this->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null);
/** @var static $reflect */ $server->set($settings['settings'] ?? []);
$reflect = Snowflake::getDi()->getReflect(static::class)?->newInstance(); $server->on('receive', [$this, 'onReceive']);
$reflect->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null); $server->on('connect', [$this, 'onConnect']);
$reflect->setEvents(Constant::RECEIVE, $settings['events'][Constant::RECEIVE] ?? null); $server->on('close', [$this, 'onClose']);
$reflect->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null); return $server;
static::$_tcp = $server->addlistener($host, $port, $mode);
if (!(static::$_tcp instanceof Port)) {
trigger_error('Port is ' . $host . '::' . $port . ' must is tcp listener type.');
}
static::$_tcp->set($settings['settings'] ?? []);
static::$_tcp->on('receive', [$reflect, 'onReceive']);
static::$_tcp->on('connect', [$reflect, 'onConnect']);
static::$_tcp->on('close', [$reflect, 'onClose']);
return static::$_tcp;
} }
+5 -17
View File
@@ -6,7 +6,6 @@ use Exception;
use ReflectionException; use ReflectionException;
use Snowflake\Event; use Snowflake\Event;
use Snowflake\Exception\NotFindClassException; use Snowflake\Exception\NotFindClassException;
use Snowflake\Snowflake;
use Swoole\Server; use Swoole\Server;
use Swoole\Server\Port; use Swoole\Server\Port;
@@ -35,25 +34,14 @@ class UDPServerListener extends Abstracts\Server
* @throws ReflectionException * @throws ReflectionException
* @throws Exception * @throws Exception
*/ */
public static function instance(Server $server, string $host, int $port, int $mode, ?array $settings = []): Server\Port public function bindCallback(Server|Port $server, ?array $settings = []): Server\Port
{ {
if (!in_array($mode, [SWOOLE_UDP, SWOOLE_UDP6])) { $this->setEvents(Constant::PACKET, $settings['events'][Constant::PACKET] ?? null);
trigger_error('Port mode ' . $host . '::' . $port . ' must is udp listener type.');
}
/** @var static $reflect */ $server->set($settings['settings'] ?? []);
$reflect = Snowflake::getDi()->getReflect(static::class)->newInstance(); $server->on('packet', [$this, 'onPacket']);
$reflect->setEvents(Constant::PACKET, $settings['events'][Constant::PACKET] ?? null);
static::$_udp = $server->addlistener($host, $port, $mode); return $server;
if (!(static::$_udp instanceof Port)) {
trigger_error('Port is ' . $host . '::' . $port . ' must is tcp listener type.');
}
static::$_udp->set($settings['settings'] ?? []);
static::$_udp->on('packet', [$reflect, 'onPacket']);
return static::$_udp;
} }
+21 -26
View File
@@ -27,41 +27,36 @@ class WebSocketServerListener extends Abstracts\Server
/** /**
* @param mixed $server * @param mixed $server
* @param string $host
* @param int $port
* @param int $mode
* @param array|null $settings * @param array|null $settings
* @return Server\Port * @return Server\Port
* @throws ReflectionException * @throws ReflectionException
* @throws NotFindClassException
* @throws Exception * @throws Exception
*/ */
public static function instance(mixed $server, string $host, int $port, int $mode, ?array $settings = []): Server\Port public function bindCallback(Server|Port $server, ?array $settings = []): Server\Port
{ {
if (!in_array($mode, [SWOOLE_TCP, SWOOLE_TCP6])) { $this->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null);
trigger_error('Port mode ' . $host . '::' . $port . ' must is udp listener type.'); $this->setEvents(Constant::HANDSHAKE, $settings['events'][Constant::HANDSHAKE] ?? null);
$this->setEvents(Constant::MESSAGE, $settings['events'][Constant::MESSAGE] ?? null);
$this->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null);
$server->set($settings['settings'] ?? []);
$server->on('connect', [$this, 'onConnect']);
$server->on('handshake', [$this, 'onHandshake']);
$server->on('message', [$this, 'onMessage']);
$server->on('close', [$this, 'onClose']);
if (swoole_version() >= '4.7' && isset($settings['events'][Constant::DISCONNECT])) {
$this->setEvents(Constant::DISCONNECT, $settings['events'][Constant::DISCONNECT]);
$server->on('disconnect', [$this, 'onDisconnect']);
} }
/** @var static $reflect */ $events = $settings['events'][Constant::REQUEST] ?? [];
$reflect = Snowflake::getDi()->getReflect(static::class)?->newInstance(); if (!empty($events) && is_array($events)) {
$reflect->setEvents(Constant::CONNECT, $settings['events'][Constant::CONNECT] ?? null); $events[0] = Snowflake::getDi()->get($events[0]);
$reflect->setEvents(Constant::HANDSHAKE, $settings['events'][Constant::HANDSHAKE] ?? null); $server->on('request', $events);
$reflect->setEvents(Constant::DISCONNECT, $settings['events'][Constant::DISCONNECT] ?? null);
$reflect->setEvents(Constant::MESSAGE, $settings['events'][Constant::MESSAGE] ?? null);
$reflect->setEvents(Constant::CLOSE, $settings['events'][Constant::CLOSE] ?? null);
static::$_http = $server->addlistener($host, $port, $mode);
if (!(static::$_http instanceof Port)) {
trigger_error('Port is ' . $host . '::' . $port . ' must is tcp listener type.');
} }
return $server;
static::$_http->set($settings['settings'] ?? []);
static::$_http->on('connect', [$reflect, 'onConnect']);
static::$_http->on('handshake', [$reflect, 'onHandshake']);
static::$_http->on('message', [$reflect, 'onMessage']);
static::$_http->on('disconnect', [$reflect, 'onDisconnect']);
static::$_http->on('close', [$reflect, 'onClose']);
return static::$_http;
} }