搜索
查看: 6280|回复: 14

关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

[复制链接]
发表于 2006-8-14 00:51:04 | 显示全部楼层 |阅读模式 来自 中国–江苏–苏州
这个思路一直静静地躺在我服务器上,迪酷宣称花了巨资搞了那个平台,但是我在Linux下进行了模拟,经过实验,测试有效,而这个方案我仅仅报价为7500。与其浪费,不如我公开核心思路,把它给需要的人。
这个东西,我选择Linux平台主要考虑
第一:Linux的稳定
第二:强大的Shell功能便于实施集群管理
第三:数据的安全性有保障

首先是用户注册系统,这需要一个Web环境,考虑到后面要对数据库导出后进行操作,我选择了MySQL

通常意义,这个Web程序应该具备服务器管理及会员注册功能,其中会员密码为了方面后面操作可以采取明码方式进行储存

下面是我设计的数据库结构

  1. CREATE TABLE `access` (
  2.   `webpage` varchar(50) NOT NULL default '',
  3.   `fromurl` varchar(100) NOT NULL default '',
  4.   `fromip` varchar(10) NOT NULL default '',
  5.   `fromarea` varchar(10) NOT NULL default '',
  6.   `accesstime` datetime NOT NULL default '0000-00-00 00:00:00'
  7. ) ENGINE=MyISAM DEFAULT CHARSET=gb2312;


  8. CREATE TABLE `const` (
  9.   `id` tinyint(1) unsigned NOT NULL default '0',
  10.   `webname` varchar(50) NOT NULL default '',
  11.   `webtitle` varchar(50) NOT NULL default '',
  12.   `copyright` varchar(100) NOT NULL default '',
  13.   `shownumperpage` tinyint(4) NOT NULL default '0',
  14.   `tim` int(10) unsigned NOT NULL default '0',
  15.   PRIMARY KEY  (`id`)
  16. ) ENGINE=MyISAM DEFAULT CHARSET=gb2312;


  17. INSERT INTO `const` (`id`, `webname`, `webtitle`, `copyright`, `shownumperpage`, `tim`) VALUES (1, 'HLServer.net用户注册系统', 'HLServer.net用户注册系统', 'yuan', 15, 4294967295);


  18. CREATE TABLE `server` (
  19.   `id` int(10) unsigned NOT NULL auto_increment,
  20.   `area` varchar(10) NOT NULL default '',
  21.   `city` varchar(100) NOT NULL default '',
  22.   `serverurl` varchar(100) NOT NULL default '',
  23.   `usercount` int(10) unsigned default NULL,
  24.   PRIMARY KEY  (`id`)
  25. ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=2 ;


  26. CREATE TABLE `static` (
  27.   `statdate` date NOT NULL default '0000-00-00',
  28.   `totalip` int(10) unsigned NOT NULL default '0',
  29.   `pageviews` int(10) unsigned NOT NULL default '0',
  30.   `lasttime` datetime NOT NULL default '0000-00-00 00:00:00',
  31.   PRIMARY KEY  (`statdate`)
  32. ) ENGINE=MyISAM DEFAULT CHARSET=gb2312;


  33. CREATE TABLE `user` (
  34.   `id` int(10) unsigned NOT NULL auto_increment,
  35.   `userno` varchar(20) NOT NULL default '',
  36.   `remark_0` varchar(20) NOT NULL default 'ss_qx_cjt_1',
  37.   `account` varchar(20) default NULL,
  38.   `password` varchar(16) NOT NULL default '',
  39.   `remark_1` varchar(20) NOT NULL default 'ss_qx_cjt_2',
  40.   `username` varchar(10) NOT NULL default '',
  41.   `level` tinyint(1) NOT NULL default '0',
  42.   `question` varchar(200) NOT NULL default '',
  43.   `answer` varchar(100) NOT NULL default '',
  44.   `addtime` date NOT NULL default '0000-00-00',
  45.   `logins` int(10) unsigned NOT NULL default '0',
  46.   `logintime` datetime NOT NULL default '0000-00-00 00:00:00',
  47.   `loginip` varchar(10) NOT NULL default '',
  48.   `iflock` tinyint(1) NOT NULL default '0',
  49.   `serverids` varchar(200) NOT NULL default '',
  50.   `remark_2` varchar(20) NOT NULL default 'ss_qx_cjt3',
  51.   PRIMARY KEY  (`id`)
  52. ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 AUTO_INCREMENT=1 ;
复制代码


AMX的用户权限系统,AMX提供了配置文件管理用户(admin)权限,一般意义上这个配置文件装载的用户是有限的(#define MAX_ADMINS  64),但是它的源文件提供了MySQL形式的连接,只需要重新编译,源文件是如此描述:


  1. // Uncomment the following line to load admins from a database
  2. //#define USE_SQL

  3. /* If you enable USE_SQL, you might create your MySQL admins table with this SQL query :

  4.   CREATE TABLE admins (
  5.     `auth` varchar(32) NOT NULL default '',
  6.     `password` varchar(32) NOT NULL default '',
  7.     `access` varchar(32) NOT NULL default '',
  8.     `flags` varchar(32) NOT NULL default '',
  9.     PRIMARY KEY (`auth`)
  10.   ) TYPE=MyISAM;

  11. * IMPORTANT:
  12. * Check $moddir/addons/amx/config/mysql.cfg for MySQL access configuration
  13. *
  14. */
复制代码


在我的测试服务器上,我的用户权限数据记录是这样的

  1. CREATE TABLE `admins` (
  2.   `auth` varchar(32) NOT NULL default '',
  3.   `password` varchar(32) NOT NULL default '',
  4.   `access` varchar(32) NOT NULL default '',
  5.   `flags` varchar(32) NOT NULL default '',
  6.   PRIMARY KEY  (`auth`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

  8. INSERT INTO `admins` (`auth`, `password`, `access`, `flags`) VALUES ('ss', '123456', 'abcdefghijklmnopqrstu', 'a');
复制代码


如何第一段数据库里的user信息插入进MySQL就是问题关键,这里采用了grep等程序过滤数据库文本,例如:
  1. ./usr/bin/mysqldump -uroot -ppassword -B amx_user --tables user --no-create-info >/usr/local/songsong/amx_user_shell/amx_user.sql

  2. grep INSERT amx_user.sql |sed 's/ss_qx_cjt3/\n/g'|sed 's/\(.*\)*.ss_utf_7/\n/g'|sed 's/\(.*\)ss_utf_8.*/\1/g'|sed '/^ *$/d'|sed -e "s/');//g" -e "s/','/"/g" -e "s/"/" "/g" -e "s/^" //g" -e "s/ "$//g"|sed '/^ *$/d'|sed -e "s/$/ "j" "a"/g"
复制代码


众所周知,MySQL提供了良好的远程通讯功能,这为注册用户在集群服务器之间的帐号通用提供老可能

至于备份远程服务器的日志,则可以通过SCP进行通讯,比如
  1. #!/usr/bin/expect
  2. spawn scp -P 27 root@123.456.78.90:/root/hlds/home/hlds_l/cstrike/logs/*.* /home/logs
  3. expect "password:"
  4. send "yourpassword\r"
  5. expect >
  6. interact
复制代码

这段代码可能有安全隐患,建议以非root用户操作。另外传递是逆向的,稍微好一些。当被crond载入后可以实现定时传递远程备份的数据

监听远程服务器状态效率比较好的办法有2个
一个是采用官方提供的接口进行数据分析,这段代码我会在近期公布
一个是利用nmap功能,采用UDP协议,对27010-27030进行定时监听,形成缓存记录并在前台以Web方式显示
发表于 2006-8-14 01:27:46 | 显示全部楼层 来自 中国–湖北–襄阳

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

个人觉得DCOO的排行并没有特别的地方,要说到数据统计,插件可以统计的项目实在数不过来,要说到注册用户,这早已不是新鲜的事情了,AMXX+MYSQL更是很简单,说到服务器状态,UA官方网站上有PHPUA,只是它是PHP而已,修改一下,完全能满足任何要求,要说到DCOO,我大概看了下,是ASP的,但是好象并不是即时更新的,也是缓存记录,要想使用ASP达到即时查看服务器状态的话(即每刷新一次,只要服务器数据有变化,那么ASP前台就会立即显示),并不是不可能的事情,很早的时候就有类似的控件实现了真正的即时查看信息,其实只要使用socket控件对服务器端口进行通讯,相信完全可以做到,只是没有人去做而已,一般都用来发EMAIL,聊天程序之类的!

楼主的意思我看明白了一些,但不是完全明白,不够确定你要表达的内容!
1。要求注册?
2。用户数据库共享?
3。服务器即时状态?
回复

使用道具 举报

发表于 2006-8-14 01:41:15 | 显示全部楼层 来自 中国–广东–深圳–南山区

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

songsong是个强人,顶。
回复

使用道具 举报

发表于 2006-8-14 12:09:06 | 显示全部楼层 来自 中国–广东–深圳–宝安区

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

我来来顶,防Dcoo的排名系统,其实思路很简单的!!!
不过有些技术的工作有点难度!!

如有以下需求,即可完全做出来比Dcoo功能更强的排名系统来
一:amxx 插件,可即是用socket协议,或UDP通信,实时写玩家数据到mysql表中,即可!

二:只要mysql表里有即时数据,PHP读mysql大家都不难吧!

三:至于网吧分别排行,也很简单,只需,读网吧IP即可分类!

四:月份、周期排行,呵,读时间就行了!

五:收费吗,联系一下电信就OK了,搞个手机付费接口!!!



---------以上内容,主要还是amxx插件的写法,!
回复

使用道具 举报

 楼主| 发表于 2006-8-14 12:15:55 | 显示全部楼层 来自 中国–江苏–苏州

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

Post by '[Grief.QQ
']个人觉得DCOO的排行并没有特别的地方,要说到数据统计,插件可以统计的项目实在数不过来,要说到注册用户,这早已不是新鲜的事情了,AMXX+MYSQL更是很简单,说到服务器状态,UA官方网站上有PHPUA,只是它是PHP而已,修改一下,完全能满足任何要求,要说到DCOO,我大概看了下,是ASP的,但是好象并不是即时更新的,也是缓存记录,要想使用ASP达到即时查看服务器状态的话(即每刷新一次,只要服务器数据有变化,那么ASP前台就会立即显示),并不是不可能的事情,很早的时候就有类似的控件实现了真正的即时查看信息,其实只要使用socket控件对服务器端口进行通讯,相信完全可以做到,只是没有人去做而已...


:cool:
建议你按照你说的思路跑一遍你就会发现问题
回复

使用道具 举报

发表于 2006-8-14 14:39:48 | 显示全部楼层 来自 中国–湖北–襄阳

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

Post by Songsong
:cool:
建议你按照你说的思路跑一遍你就会发现问题


这么来说吧,就用插件,那么即时排行,没问题吧,统计项目暂不考虑,在数据库中,统计数据中增加一个字段PASSW,插件中这样,如果PASSW为空,则为未注册用户,且每次进入服务器提示未注册,请 say/密码 进行注册,这不难吧?如果PASSW有值,则为注册用户,那么,进入服务器就提示 say/密码 进行确认,这个也是可以的吧?如果密码错误,或者KICK,或者强制改名,至于服务器即时状态,以前就有过Q3PLUG,是完全即时状态的,只是它做成了DLL,在本地监听服务端得到信息的,实际上就是个微型的HLSW,如果稍加改进,做成控件,在ASP中或者HTML中调用,我觉得是可以达到效果的,这方面来说,PHP可能就相对简单的多。DCOO有它的特色,但是我觉得模仿就没必要了,毕竟,这些东西都已经实现了,如果真要在这方面做些研究的话,点通应该做出真正属于自己而且有特色的东西来!不过本人不才,ASP和程序都是一知半解!

PS:个人见解,仅做讨论!

另小企鹅所说,实时写数据库,不说一天,单说一幅地图内,就有多少玩家的数据是变动的?变动一次就读写一次,恐怕机器再好,也够受的了!
回复

使用道具 举报

发表于 2006-8-14 18:32:50 | 显示全部楼层 来自 中国–河南–南阳–新野县

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

脑袋都大了 只能来凑凑热闹 帮你顶:sexy_girl
回复

使用道具 举报

发表于 2006-8-14 23:12:24 | 显示全部楼层 来自 中国–广东–广州–天河区

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

Post by Songsong
我今年为贵阳的稻草人设计了一个方案,结果他数次失信,让我徒劳无益。

这个思路一直静静地躺在我服务器上,迪酷宣称花了巨资搞了那个平台...



这种东西没什么好说,想做就能做到。
回复

使用道具 举报

发表于 2006-8-15 01:15:54 | 显示全部楼层 来自 中国–广东–深圳

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

不太明白楼主的意思,我与二楼站同一角度!
回复

使用道具 举报

发表于 2006-8-15 11:13:53 | 显示全部楼层 来自 中国–广东–湛江

回复: 关于模拟迪酷排名系统的技术讨论(欢迎有能力的补充修正)

songsong给出一个可以实看的页面?这样更直观
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表