|
@@ -27,8 +27,19 @@ class MyServerV2
|
|
|
|
|
|
|
|
public function __construct()
|
|
public function __construct()
|
|
|
{
|
|
{
|
|
|
- $this->serv = new \swoole_websocket_server("0.0.0.0", 9090);
|
|
|
|
|
- $this->serv->set(GlobConfigs::getKey('swoolev2'));
|
|
|
|
|
|
|
+ $config = GlobConfigs::getKey('swoole');
|
|
|
|
|
+ $this->serv = new \swoole_websocket_server($config['host'], $config['port']);
|
|
|
|
|
+ $this->serv->set($config['sets']);
|
|
|
|
|
+
|
|
|
|
|
+ //内存表(用户uid和fd的双向映射表)
|
|
|
|
|
+ $fd_table = new \swoole_table($config['maxUsers']);
|
|
|
|
|
+ $fd_table->column("uid", \swoole_table::TYPE_INT, 4);
|
|
|
|
|
+ $fd_table->create();
|
|
|
|
|
+ $user_table = new \swoole_table($config['maxUsers']);
|
|
|
|
|
+ $user_table->column("fid", \swoole_table::TYPE_INT, 4);
|
|
|
|
|
+ $user_table->create();
|
|
|
|
|
+ $this->serv->ftable = $fd_table;
|
|
|
|
|
+ $this->serv->utable = $user_table;
|
|
|
|
|
|
|
|
$this->serv->on('Start', array($this, 'onStart'));
|
|
$this->serv->on('Start', array($this, 'onStart'));
|
|
|
$this->serv->on('WorkerStart', array($this, 'onWorkerStart'));
|
|
$this->serv->on('WorkerStart', array($this, 'onWorkerStart'));
|
|
@@ -137,9 +148,9 @@ class MyServerV2
|
|
|
|
|
|
|
|
public function onMessage($serv, $frame)
|
|
public function onMessage($serv, $frame)
|
|
|
{
|
|
{
|
|
|
- if ( strtolower($frame->data->data) == '{"type":"ping"}'){
|
|
|
|
|
- $serv->send($frame->fd,'{"type":"pong"}');
|
|
|
|
|
- return ;
|
|
|
|
|
|
|
+ if (strtolower($frame->data->data) == '{"type":"ping"}') {
|
|
|
|
|
+ $serv->send($frame->fd, '{"type":"pong"}');
|
|
|
|
|
+ return;
|
|
|
}
|
|
}
|
|
|
Wlog::getInstance()->WriteLog($frame);
|
|
Wlog::getInstance()->WriteLog($frame);
|
|
|
$serv->task($frame);
|
|
$serv->task($frame);
|
|
@@ -147,7 +158,7 @@ class MyServerV2
|
|
|
|
|
|
|
|
public function onOpen($serv, $request)
|
|
public function onOpen($serv, $request)
|
|
|
{
|
|
{
|
|
|
- Wlog::getInstance()->WriteLog(['onOpenData',$request]);
|
|
|
|
|
|
|
+ //Wlog::getInstance()->WriteLog(['onOpenData', $request]);
|
|
|
$token = isset($request->get['token']) ? $request->get['token'] : '';
|
|
$token = isset($request->get['token']) ? $request->get['token'] : '';
|
|
|
//$uid = isset($request->get['uid']) ? $request->get['uid'] : '';
|
|
//$uid = isset($request->get['uid']) ? $request->get['uid'] : '';
|
|
|
$fd = $request->fd;
|
|
$fd = $request->fd;
|
|
@@ -156,21 +167,29 @@ class MyServerV2
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
$token_uid = $uid = intval($this->workRedis->hget(MAPS_TOKEN_UID, md5($token)));
|
|
$token_uid = $uid = intval($this->workRedis->hget(MAPS_TOKEN_UID, md5($token)));
|
|
|
- if (empty($token) || !$token_uid ) {
|
|
|
|
|
|
|
+ if (empty($token) || !$token_uid) {
|
|
|
$serv->push($request->fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'invalid_token', 'data' => ['msg' => '无效的token']]));
|
|
$serv->push($request->fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'invalid_token', 'data' => ['msg' => '无效的token']]));
|
|
|
$serv->disconnect($request->fd);
|
|
$serv->disconnect($request->fd);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- $oldfid = $this->workRedis->hget(MAPS_UID_FID, $uid);
|
|
|
|
|
- if ($oldfid != '' && $oldfid != $fd && $serv->exist($oldfid)) {
|
|
|
|
|
- $serv->push($oldfid, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'force_logout', 'data' => [ 'msg' => '你已在其它地方登陆,本次退出!']]));
|
|
|
|
|
- $serv->disconnect($oldfid);
|
|
|
|
|
|
|
+ //管理员账号可以多连
|
|
|
|
|
+ $adminconfig = GlobConfigs::getKey('admin_conf');
|
|
|
|
|
+ if ($adminconfig['admin_uid'] != $uid) {
|
|
|
|
|
+ $oldfid = $this->workRedis->hget(MAPS_UID_FID, $uid);
|
|
|
|
|
+ if ($oldfid != '' && $oldfid != $fd && $serv->exist($oldfid)) {
|
|
|
|
|
+ $serv->push($oldfid, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'force_logout', 'data' => ['msg' => '你已在其它地方登陆,本次退出!']]));
|
|
|
|
|
+ $serv->disconnect($oldfid);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $this->workRedis->hset(MAPS_UID_FID, $uid, $fd);
|
|
|
|
|
+ $this->workRedis->hset(MAPS_FID_UID, $fd, $uid);
|
|
|
|
|
+ $serv->ftable->set($fd, ['uid' => $uid]);
|
|
|
|
|
+ $serv->utable->set($uid, ['fid' => $fd]);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- $this->workRedis->hset(MAPS_UID_FID, $uid, $fd);
|
|
|
|
|
- $this->workRedis->hset(MAPS_FID_UID, $fd, $uid);
|
|
|
|
|
- $serv->push($fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'well_come', 'data' => [ 'msg' => '成功接入']]));
|
|
|
|
|
|
|
+
|
|
|
|
|
+ $serv->push($fd, DataPack::toJson(['mtype' => 'system_msg', 'stype' => 'well_come', 'data' => ['msg' => '成功接入']]));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function onTask($serv, \Swoole\Server\Task $task)
|
|
public function onTask($serv, \Swoole\Server\Task $task)
|
|
@@ -179,7 +198,7 @@ class MyServerV2
|
|
|
Wlog::getInstance()->WriteLog($task, 1, $serv->worker_id);
|
|
Wlog::getInstance()->WriteLog($task, 1, $serv->worker_id);
|
|
|
CmdProxy::getInstance()->ParaCMD($serv, $task);
|
|
CmdProxy::getInstance()->ParaCMD($serv, $task);
|
|
|
} catch (\Exception $e) {
|
|
} catch (\Exception $e) {
|
|
|
- Wlog::getInstance()->WriteLog(['onTask error:',$task,$e->getCode() . ' ' . $e->getMessage()], 3, $serv->worker_id);
|
|
|
|
|
|
|
+ Wlog::getInstance()->WriteLog(['onTask error:', $task, $e->getCode() . ' ' . $e->getMessage()], 3, $serv->worker_id);
|
|
|
echo "发生异常." . $e->getCode() . ' ' . $e->getMessage() . "\n";
|
|
echo "发生异常." . $e->getCode() . ' ' . $e->getMessage() . "\n";
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -191,8 +210,14 @@ class MyServerV2
|
|
|
public function onClose($serv, $fd, $from_id)
|
|
public function onClose($serv, $fd, $from_id)
|
|
|
{
|
|
{
|
|
|
$uid = $this->workRedis->hget("MAPS_FID_UID", $fd);
|
|
$uid = $this->workRedis->hget("MAPS_FID_UID", $fd);
|
|
|
- $this->workRedis->hdel(MAPS_UID_FID, $uid);
|
|
|
|
|
- $this->workRedis->hdel(MAPS_FID_UID, $fd);
|
|
|
|
|
|
|
+ $adminconfig = GlobConfigs::getKey('admin_conf');
|
|
|
|
|
+ if ($adminconfig['admin_uid'] != $uid) {
|
|
|
|
|
+ $this->workRedis->hdel(MAPS_UID_FID, $uid);
|
|
|
|
|
+ $this->workRedis->hdel(MAPS_FID_UID, $fd);
|
|
|
|
|
+
|
|
|
|
|
+ $serv->ftable->del($fd);
|
|
|
|
|
+ $serv->utable->del($uid);
|
|
|
|
|
+ }
|
|
|
echo "ClientFd:{$fd} -- uid:{$uid} close connection!\n";
|
|
echo "ClientFd:{$fd} -- uid:{$uid} close connection!\n";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -327,8 +352,8 @@ class MyServerV2
|
|
|
$redis->del(MAPS_FID_UID);
|
|
$redis->del(MAPS_FID_UID);
|
|
|
//$redis->del(MAPS_TOKEN_UID);
|
|
//$redis->del(MAPS_TOKEN_UID);
|
|
|
//$redis->del(MAPS_UID_TOKEN);
|
|
//$redis->del(MAPS_UID_TOKEN);
|
|
|
- $redis->hset(MAPS_UID_TOKEN,$adminconf['admin_uid'],$adminconf['md5']);
|
|
|
|
|
- $redis->hset(MAPS_TOKEN_UID,$adminconf['md5'],$adminconf['admin_uid']);
|
|
|
|
|
|
|
+ $redis->hset(MAPS_UID_TOKEN, $adminconf['admin_uid'], $adminconf['md5']);
|
|
|
|
|
+ $redis->hset(MAPS_TOKEN_UID, $adminconf['md5'], $adminconf['admin_uid']);
|
|
|
$redis->exec();
|
|
$redis->exec();
|
|
|
$redis->close();
|
|
$redis->close();
|
|
|
}
|
|
}
|