大家在玩游戏或使用QQ等IM工具时,想必都见到过弹出被顶号或者是您的账号于xx时间在另一设备登录,您已被迫下线这样的提示,然后不得不点退出按钮退出整个应用,或者点击重新登录把另一设备再顶下来。最近我参与的一个项目,正好就有这样的需求,而且,由于我们项目中已经使用到了MQTT协议进行消息推送,实现远程控制,后台用Java实现,缓存使用了Redis,因此,正好可以利用现有的技术来实现这个功能。
实现的思路大概如下:首先,登录时不仅需要账号密码,还可以将设备关键信息记录下来,如设备型号(Android|iPhone)、登录时间、登录IP、设备唯一标识(UUID)等,这就需要前台登录功能与后台接口一起配合实现,并在后台把userId已经相关设备信息保存到Redis中,当在另外一台新设备上登录同一帐号时,将userId对应的相关登录设备信息直接进行覆盖,此时如果旧设备进行重连时,因为该uuid已经不是当前服务端的uuid了,所以直接返回下线通知,为了进行友好提示,也可以将新登录设备的主要信息(设备型号、登录时间)进行返回。
下面简单介绍一下实现的方法。
软件安装
Linux下mqtt服务器Apollo的安装
下载
选择一个目录用来下载保存
下载地址: http://activemq.apache.org/apollo/download.html
官网教程: http://activemq.apache.org/apollo/documentation/getting-started.html
目前版本是 apache-apollo-1.7.1-unix-distro.tar .gz
创建broker
一个broker实例是一个文件夹,其中包含所有的配置文件及运行时的数据,不如日志和消息数
据。Apollo强烈建议不要把实例同安装文件放在一起。在linux操作系统下面,建议将实例建在
/var/lib/目录下面
首先解压:tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz
选择一个目录存放解压后的文件,我放在了/server/下,解压后的文件夹为 apache-apollo-1.7.1
开始创建broker实例:
cd /var/lib
sudo /server/apache-apollo-1.7.1/bin/apollo create mybroker
下图是Apache官方给的一些建议截图:
启动broker实例
启动broker实例可以有两种方法,如下图中所示:
可以执行
/var/lib/mybroker/bin/apollo-broker run
或者
sudo ln -s "/var/lib/mybroker/bin/apollo-broker-service" /etc/init.d/
/etc/init.d/apollo-broker-service start
使其作为一个service进行启动,以后系统重启后只需运行/etc/init.d/apollo-broker-service start
访问Apollo的监控页面: http://localhost:61680/ 默认用户名、密码为为 admin/password
Linux下Redis的安装与配置
Redis的安装非常简单,已经有现成的Makefile文件,解压后在src目录下使用make命令完成编译即可,redis-benchmark、redis-cli、redis-server、redis-stat 这四个文件,加上一个 redis.conf 就构成了整个redis的最终可用包。它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况
下载安装:
wget http://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make
make install
启动
编译后生成的可执行文件:
redis-server 是Redis的服务器,启动Redis即运行redis-server
redis-cli 是Redis自带的Redis命令行客户端,学习Redis的重要工具
./redis-server & 不指定配置直接运行,这时采用默认配置,无密码
./redis-server –port 6379 仅指定端口
./redis-server ../redis.conf 指定配置文件
最好还是使用最后一种方式进行启动
如果只是在本机连接,那麽使用默认配置文件不会有什么问题,但是,如果是连接远程服务器端的Redis,则需要对配置文件进行一些修改:
requirepass foobared
#bind 127.0.0.1 ##注释掉
protected-mode no ##从yes改成no