예제 #1
0
 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;
 }
예제 #2
0
 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');
         }
     }
 }
예제 #3
0
 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 . ']');
 }
예제 #4
0
 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);
     }
 }
예제 #5
0
 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;
             }
         }
     }
 }
예제 #6
0
 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);
             }
         }
     }
 }
예제 #7
0
 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;
             }
         }
     }
 }
예제 #8
0
 public function close(Session $session)
 {
     $fd = $session->getFd();
     Logger::addInfo('close manual(fd:' . $fd . ')');
     $this->instance->close($fd);
 }
예제 #9
0
파일: server.php 프로젝트: lscgzwd/jegarn
<?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();