public function dispatchReceivePacket(Packet $packet, Session $session) { if ($session->isAuth()) { return true; } /* @var \jegarn\session\SwooleSession $session * @var AuthPacket $pkt */ if ($pkt = AuthPacket::getPacketFromPacket($packet)) { if ($pkt->auth()) { $session->setUserId($pkt->getUid()); $session->setAuth(true); $session->setSessionId(TextUtil::generateGUID()); SessionManager::getInstance()->addSession($session); $pkt->setStatus(AuthPacket::STATUS_AUTH_SUCCESS); } else { $pkt->setStatus(AuthPacket::STATUS_AUTH_FAILED); Logger::addInfo('auth failed(fd:' . $session->getFd() . ')'); } } else { $pkt = new AuthPacket(); $pkt->setPacket($packet); $pkt->setStatus(AuthPacket::STATUS_NEED_AUTH); Logger::addInfo('auth needed(fd:' . $session->getFd() . ')'); } ServerManager::getInstance()->send($session, $pkt->getReversedPacket()); return false; }
public function dispatchReceivePacket(Packet $packet, Session $session) { if (!$session->isAuth()) { return; } /* @var \jegarn\session\SwooleSession $session * @var GroupChatPacket $pkt */ if ($pkt = ChatroomPacket::getPacketFromPacket($packet)) { // check send user is a member of this group $cm = ChatroomManager::getInstance(); if ($packet->isFromSystemUser() || $cm->isGroupUser($pkt->getGroupId(), $pkt->getFrom())) { $fromUid = $pkt->getFrom(); if ($uidList = $cm->getGroupUsers($pkt->getGroupId())) { $sm = ServerManager::getInstance(); foreach ($uidList as $uid) { if ($uid != $fromUid) { $pktCopy = clone $pkt; $pktCopy->setTo($uid); if ($toSession = SessionManager::getInstance()->getSessionByUserId($uid)) { Logger::addInfo('user online,chatroom(uid:' . $uid . ')'); $sm->send($toSession, $pktCopy); } else { Logger::addInfo('user not online,chatroom,abandon message(uid:' . $uid . ')'); } } } } else { Logger::addInfo('chatroom ' . $pkt->getGroupId() . ' users lost, from uid ' . $pkt->getFrom()); } } else { Logger::addInfo('chatroom ' . $pkt->getGroupId() . ' has no user ' . $pkt->getFrom() . ' and it is not a system user'); } } }
protected function addSocketError($id, $preMessage) { if (isset($this->clients[$id])) { $errorNo = $this->clients[$id]->errCode; $errorStr = socket_strerror($errorNo); } else { $errorNo = 0; $errorStr = ''; } Logger::addError($preMessage . ': ' . $id . ' ' . $errorStr . '[' . $errorNo . ']'); }
protected function sendOrSavePacket(GroupChatPacket $packet, $uid) { $pkt = clone $packet; $pkt->setTo($uid); if ($toSession = SessionManager::getInstance()->getSessionByUserId($uid)) { Logger::addInfo('user online,groupchat(uid:' . $uid . ')'); ServerManager::getInstance()->send($toSession, $pkt); } else { Logger::addInfo('user not online,groupchat,storage message(uid:' . $uid . ')'); OfflineGroupMessageManager::getInstance()->addPacket($uid, $pkt); } }
public function dispatchOffline(Session $session) { if ($this->listeners) { /* @var PacketInterface $listener */ foreach ($this->listeners as $listener) { Logger::addInfo('packet dispatch offline(' . get_class($listener) . ')'); if (false === $listener->dispatchOfflinePacket($session)) { return false; } } } }
public function dispatchReceivePacket(Packet $packet, Session $session) { /* @var \jegarn\session\SwooleSession $toUserSession * @var ChatPacket $pkt */ if ($session->isAuth()) { if ($pkt = NotificationPacket::getPacketFromPacket($packet)) { if ($toUserSession = SessionManager::getInstance()->getSessionByUserId($packet->getTo())) { Logger::addInfo('user online,notification(uid:' . $packet->getTo() . ')'); ServerManager::getInstance()->send($toUserSession, $pkt); } else { Logger::addInfo('user offline,storage notification(uid:' . $packet->getTo() . ')'); OfflineNotificationMessageManager::getInstance()->addPacket($packet->getTo(), $pkt); } } } }
protected function dealWebsocketPacket($server, $fd, $from_id) { $session = $this->getSwooleSession($server, $fd, $from_id); $sessionManager = SessionManager::getInstance(); for (;;) { $packetStr = $this->wsBuffProcessor->consumePacket($fd, $response); if ($response == WebsocketBufferProcessor::$PONG) { Logger::addInfo('send pong packet : (fd: ' . $fd . ')'); $this->instance->send($fd, WebsocketBufferProcessor::$PONG); } else { if ($response == WebsocketBufferProcessor::$CLOSE) { $this->close($session); // browser not close the connection but send a close packet, so close it manual. } } if (is_string($packetStr)) { if ($packet = $this->parsePacket($packetStr, $sessionId, $serverInfo)) { Logger::addInfo('parsed packet info: (fd: ' . $fd . ')' . str_replace("\n", ' ', var_export($packet, true)) . 'session: ' . $sessionId . '|serverInfo: ' . $serverInfo); if (!$sessionManager->isValidSession($session) && $sessionId && ($fs = $sessionManager->getSessionBySessionId($sessionId))) { $session = $fs; } if (false === $this->dispatchReceive($session, $packet)) { Logger::addInfo('dispatch receive failed: (fd: ' . $fd . ')'); } } else { $this->increaseError(); Logger::addError('str can not convert packet(fd: ' . $fd . ')[BEGIN]' . $packetStr . '[END]'); } } else { if (false === $packetStr) { $this->increaseError(); Logger::addError('packet parse failed(fd: ' . $fd . ')'); break; } else { break; } } } }
public function close(Session $session) { $fd = $session->getFd(); Logger::addInfo('close manual(fd:' . $fd . ')'); $this->instance->close($fd); }
<?php use jegarn\cache\Cache; use jegarn\log\FileLoggerHandler; use jegarn\log\Logger; use jegarn\manager\ServerManager; use jegarn\manager\PacketManager; use jegarn\server\SwooleServer; require __DIR__ . '/../../src/bootstrap.php'; $config = (require __DIR__ . '/config/server.php'); isset($argv[1]) && ($config['server']['host'] = $argv[1]); isset($argv[2]) && ($config['server']['port'] = $argv[2]); Cache::getInstance()->initConfig($config['cache']); Logger::addHandler(new FileLoggerHandler($config['file_logger'])); foreach ($config['listener'] as $listener) { PacketManager::getInstance()->addListener(new $listener()); } ServerManager::getInstance()->addServer(new SwooleServer())->initConfig($config['server'])->start();