在Ghost里修复就会提示你重新启动,然后进入ghost自己选当时自己前面Ghost的文件恢复即可。
查看apache运行的用户和组:



vi ../../../../apache2/conf/httpd.conf

User nobody
Group nogroup



一般不是fast cgi模式的时候,应该似乎apache的权限,但这儿,我们的apache是noboey  nogroup,而

vi /etc/group

nogroup:x:65534:nobody


vi /etc/passwd

nobody:x:65534:65533:nobody:/var/lib/nobody:/bin/bash



jackxiang:/etc # ps aux|grep httpd
root      9910  0.0  0.1 149460 11896 ?        Ss   Aug25   0:33 /usr/local/httpd-2.0.59/bin/httpd -k restart
nobody     852  0.0  0.2 149848 23692 ?        S    15:13   0:03 /usr/local/httpd-2.0.59/bin/httpd -k restart
nobody     886  0.0  0.2 149828 23624 ?        S    15:14   0:03 /usr/local/httpd-2.0.59/bin/httpd -k restart
nobody     892  0.0  0.3 149880 25092 ?        S    15:14   0:03 /usr/local/httpd-2.0.59/bin/httpd -k restart



结合php代码:

    if (is_dir ( $directory )) {
      var_dump(is_writable ( $directory ));
      exit;
      if (is_writable ( $directory )) {
        if (@move_uploaded_file ( $filename, $newfile )) {
          // chmod our file
          @chmod ( $newfile, $fileMode );
          return $newfile;
        }
      }
    }
    $adlog = new TMLog ( );
    $adlog->ll ( "Handle upload file Error" );

结果:

bool(false)

查看上传目录权限:

Jackxiang:/data/jackxiang/henganxy/htdocs/view # ls -lart|grep data
drwxr-xr-x  2 jackxiang users  4096 Oct 27 18:20 data

是jackxiang 不是nobody nogroup组,于是得修改:

chown -R nobody:nogroup data/    
chmod -R 755 data/

755 是拥有的可以写入,其余有执行和读取权限,没有写入权限。

然后在上传,后查看目录如下:
Jackxiang:/data/jackxiang/henganxy/htdocs/view # ls data/
2009_10_27_19_38_50_1.jpg  mini_2009_10_27_19_38_50_1.jpg
成功!!!

开放

WEB2.0 jackxiang 2009-10-27 17:45
线索一,腾讯推出“QQ返利平台”,向第三方B2C网站导入用户。当用户登陆QQ后,可通过QQ返利频道的链接到达比如当当、京东、Vancl等商城。购物后,将收到QQ返回的占商品价格3%-22%不等的现金。

线索二,QQ空间接入第三方网站的功能。用户可以在其QQ空间里直接玩耍到“5分钟”所提供的比如种菜、偷菜这样的社交游戏,阅读到豆瓣网提供的有关热门书籍和电影的评论。
$_FILES["表单上文件框的名称"]["相关内容"]为上传后台接收到的文件的相关信息,是内置的一个超全局变量,相关内容一共包括五种内容:
原文件名及路径:[name]
文件的MIME类型:[type],例如"image/gif"
已上传文件的大小:[size]
错误信息:[error](0为正常,1234分别代表四个不同的错误信息)
文件被上传后在服务器端临时存储的文件名及路径:[tmp_name]

我们可以通过判断error是否为0来判断上传是否出错,例:
$_FILES["uppic"]["error"]==0  判断上传是否出错
还可以通过判断name是否为空来判断用户是否选择过要上传的文件
$_FILES["uppic"]["name"]==""  判断用户是否选择过要上传的文件
潜水至今,仍没有发现大家讨论embedded 的话题。那么我先抛砖引玉了。

关于embedded system,大家都不陌生,伸手就摸到的手机,抬眼就看到的冰箱电视,出门开的汽车,工厂里的工业自动化控件。说到工业自动化,工业机器人、医药设备、电话系统、卫星、飞行系统等领域,embedded system更是无处不在。通常这些都是被控制执行某些专用功能系统或者设备,它所运行的软件也通常都是固化的(firmware),终端用户很难或者不可能改变。所以一直以来embedded system的性能和可扩展性都是一个关键。Intel多核和虚拟化技术为这个问题开启了一片窗。这两项技术让硬件和IA构架集中化处理以达到降低成本的目的。Intel一直都在努力完善这两项技术在embedded system上面的应用和扩展,对Wind River 的收购,显然也是看重了Wind River在embedded system 上面成熟的软件框架。当然MS 也有一套针对于embedded system的产品:Windows Embedded Enterprise。但是显然,在Embedded 领域,Linux 比 Windows 系统在功耗和占用空间上更有优势。Embedded Linux 已经对标准的Linux经过了针对embedded system的量身定做,裁剪处理,能够固化在容量只有几K或者几M字节的存储器芯片或者单片机中,适合于特定嵌入式应用场合的专用Linux操作系统。发展至今,Embedded Linux具备了广泛的硬件支持和稳定的市场。
但是用的onclick事件,所以点击一下,就放大或者缩小一点.

<script language="javascript">
    var oTime;
    function chgSize(args) {
        var oImg = document.all['oImg'];
        oImg.style.zoom = parseInt(oImg.style.zoom) + (args ? +1 : -1)  + '%';
        oTime = window.setTimeout('chgSize(' + args + ')', 100);
    }    
document.onmouseup = function() {
window.clearTimeout(oTime);
}  
</script>
<div style="height: 200px; overflow: auto;">
<img id="oImg" src="/Files/BeyondPic/2006-8/14/28youandi.jpg" style="zoom: 100%;">
</div>
<button onmousedown="chgSize(true);" onmouseup="window.clearTimeout(oTime);">↑</button>
<button onmousedown="chgSize(false);" onmouseup="window.clearTimeout(oTime);">↓</button>


来源:http://www.85flash.com/Get/JavaScript/2006-8-17/115327705.htm

TCPDUMP

WEB2.0 jackxiang 2009-10-27 13:28


TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。


  TCPDUMP简介


  在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的。对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。


  用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共享式的局域网中,采用sniffer工具简直可以对网络中的所有流量一览无余!Sniffer工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。


  Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。所以,今天我们就来看看Linux中强大的网络数据采集分析工具——TcpDump。


  用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。


  作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的东东之一。


  顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。


  tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的 FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。


  普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。


  -----------------------


  bash-2.02# tcpdump


  tcpdump: listening on eth0


  11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50


  11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43


  0000 0000 0080 0000 1007 cf08 0900 0000


  0e80 0000 902b 4695 0980 8701 0014 0002


  000f 0000 902b 4695 0008 00


  11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97


  ffff 0060 0004 ffff ffff ffff ffff ffff


  0452 ffff ffff 0000 e85b 6d85 4008 0002


  0640 4d41 5354 4552 5f57 4542 0000 0000


  0000 00


  ^C


  ------------------------


  首先我们注意一下,从上面的输出结果上可以看出来,基本上tcpdump总的的输出格式为:系统时间 来源主机.端口 > 目标主机.端口 数据包参数


  TcpDump的参数化支持


  tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。


  然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。


  显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP 堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。


  并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。


  May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled


  虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。


  从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。


  TCP功能


  数据过滤


  不带任何参数的TcpDump将搜索系统中所有的网络接口,并显示它截获的所有数据,这些数据对我们不一定全都需要,而且数据太多不利于分析。所以,我们应当先想好需要哪些数据,TcpDump提供以下参数供我们选择数据:


  -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。


  例如:tcpdump -b arp 将只显示网络中的arp即地址转换协议信息。


  -i 选择过滤的网络接口,如果是作为路由器至少有两个网络接口,通过这个选项,就可以只过滤指定的接口上通过的数据。例如:


  tcpdump -i eth0 只显示通过eth0接口上的所有报头。


  src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst 、port、host、net、ehost等附加选项。他们用来分辨数据包的来源和去向,src host 192.168.0.1指定源主机IP地址是192.168.0.1,dst net 192.168.0.0/24指定目标是网络192.168.0.0。以此类推,host是与其指定主机相关无论它是源还是目的,net是与其指定网络相关的,ether后面跟的不是IP地址而是物理地址,而gateway则用于网关主机。可能有点复杂,看下面例子就知道了:


  tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24


  过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。


  tcpdump ether src 00:50:04:BA:9B and dst……


  过滤源主机物理地址为XXX的报头(为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。


  Tcpdump src host 192.168.0.1 and dst port not telnet


  过滤源主机192.168.0.1和目的端口不是telnet的报头。


  ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。


  例如:


  tcpdump ip src……


  只过滤数据-链路层上的IP报头。


  tcpdump udp and src host 192.168.0.1


  只过滤源主机192.168.0.1的所有udp报头。


  数据显示/输入输出


  TcpDump提供了足够的参数来让我们选择如何处理得到的数据,如下所示:


  -l 可以将数据重定向。


  如tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中。


  -n 不进行IP地址到主机名的转换。


  如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就像这样:eth0 < ntc9.1165> router.domain.net.telnet,使用-n后变成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。


  -nn 不进行端口名称的转换。


  上面这条信息使用-nn后就变成了:eth0 < ntc9.1165 > router.domain.net.23。


  -N 不打印出默认的域名。


  还是这条信息-N 后就是:eth0 < ntc9.1165 > router.telnet。


  -O 不进行匹配代码的优化。


  -t 不打印UNIX时间戳,也就是不显示时间。


  -tt 打印原始的、未格式化过的时间。


  -v 详细的输出,也就比普通的多了个TTL和服务类型


select FQQ,FScoreCount from Tbl_User into outfile "/tmp/terminatedtest.txt" fields terminated by ",";


select * from test into outfile '/home/user/test.txt'

在linux(centos)下 ,启动了mysql 并给用户文件读写的权利
grant file on *.* to root@localhost;

在linux系统上,目录的权限全部是 rwxrwxrwx
chmod 777 ...
/home/user/test
drwxrwxrwx  4 root root  4096 Sep  3 18:42 home
drwxrwxrwx 10 mapuser mapuser 4096 Sep  4 03:41 user
drwxrwxrwx 5 mapuser mapuser 4096 Sep  3 17:57 test
阅读全文

select FQQ,FScoreCount from Tbl_User into outfile "/tmp/terminatedtest.txt" fields terminated by ",";

TERMINATED BY 'n'...TERMINATED 表示字段分隔

我写这个脚本的目的是利用MySQL的select * from tablename into outfile ...语句来备份MySQL数据库,虽然没有MYSQLDUMP导出数据快,可是恢复的时候却非常快。阅读全文
Form的表头中有这样一句,  
  encType="multipart/form-data"  
  代表什么意思?删除可以么?  
有下面几个值:  

<form action="./fileupload.php" method="post" enctype="multipart/form-data" enctype="application/x-www-form-urlencoded" enctype="text/plain">



MIME(多用途网际邮件扩充协议)的编码类型。  
  脚本里的用法是form.encoding=XXX

MSDN原文,我的翻译能力比较差。  

  Optional.   Describes   the   content   of   the   body   section   of   the   message.   It   can   have   one   of   the   following   values   (the   default   is   "text/plain;   charset=us-ascii"):    
  text/plain;   charset=us-ascii  
    
  This   means   that   this   is   a   regular   message,   and   the   body   section   contains   the   message   text.  
    
  Example:   Content-Type:   text/plain;   charset=us-ascii  
    
  application/x-ms-tnef  
    
  This   means   that   this   is   a   TNEF   message   and   the   body   section   contains   the   TNEF   data   of   the   message.  
    
  Example:   Content-Type:   application/x-ms-tnef  
    
  multipart/form-data;   boundary=boundary-string  
    
  This   means   that   the   form   and   body   section   have   multiple   parts,   and   each   part   describes   a   single   form   field   (name,   value,   and   so   on).   The   boundary-string   separates   multiple   parts   in   the   body   section   (see   Body   Section).  
    
  Example:   Content-Type:   multipart/form-data;  
  boundary=xyz12sssdeeggg  
  
注意:multipart/form-data是上传文件用的,不能删除。



用Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。
下边是说明:
application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。
multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。


用于表单里有图片上传。

<form name="userInfo" method="post" action="first_submit.jsp"  ENCTYPE="multipart/form-data">
表单标签中设置enctype="multipart/form-data"来确保匿名上载文件的正确编码。
如下:

<tr>
    <td height="30" align="right">上传企业营业执照图片:</td>
    <td><INPUT TYPE="FILE" NAME="uploadfile" SIZE="34"  ōnChange="checkimage()"></td>
  </tr>

就得加ENCTYPE="multipart/form-data"。


表单中enctype="multipart/form-data"的意思,是设置表单的MIME编码。默认情况,这个编码格式是 application/x-www-form-urlencoded,不能用于文件上传;只有使用了multipart/form-data,才能完整的传递文件数据,进行下面的操作.
enctype=\"multipart/form-data\"是上传二进制数据; form里面的input的值以2进制的方式传过去。
form里面的input的值以2进制的方式传过去,所以request就得不到值了。 也就是说加了这段代码,用request就会传递不成功,

取表单值加入数据库时,用到下面的:

SmartUpload su = new SmartUpload();//新建一个SmartUpload对象
su.getRequest().getParameterValues();取数组值
su.getRequest().getParameter( );取单个参数单个值


当值很多时,使用数组传值是个不错的选择。

<input type='text' name='formVar[year1]' value=''>

function toHere($formVar)
{
    echo $formVar['year1'];
}
select distinct(fild1),FScoreCount from Tbl_User order by FScoreCount desc limit 10.
select distinct(fild1),FScore from Tbl_Score where FYear = 2009 and FWeek = '44' order by FScore desc limit 0,10;


<?php
    $today = getdate ();
       print_r($today);
      
?>


Array
(
    [seconds] => 55
    [minutes] => 41
    [hours] => 11
    [mday] => 26
    [wday] => 1
    [mon] => 10
    [year] => 2009
    [yday] => 298
    [weekday] => Monday
    [month] => October
    [0] => 1256528515
)


$currYear = $today ['year'];
select distinct(fild1),FScore from Tbl_Score where FYear = ".$currYear ."and FWeek = '44' order by FScore desc limit 0,10;
  这篇文章是《北京青年报》的记者范海涛据我在北青教育大讲堂的演讲所写,我的演讲是北青教育大讲堂活动的第二讲,原文来自《北京青年报》12月2日刊,在此以飨读者。  一个成功的人如何定义成功?一个成功的人如何从成功中获得启发?这个命题无疑会让许多人充满了悬念与期待。2008年11月30日下午,北京青年报大厦的20层大会议室迎来了北青教育大讲堂活动开办以来最爆满的盛况,谷歌全球副总裁、大中华区总裁李开复的到来,让许多人对于成功的定义有了崭新的认识。对于成功,不仅仅是对名利的追逐,不应该完全用世俗的价值观去衡量成功与否,而是实现自己的价值,关爱自己身边的人,给这个世界带来更多的影响力,用自己的力量去感染周围的磁场。当你某一天逝去的时候,你的墓志铭上应该撰写的是对你最公平的评价。成功的定义应该是多元化的。
  在这个下午,谷歌大中华区总裁李开复用平实而不失幽默的语言,讲述了自己成长中的很多故事。和许多人的成长经历相似,他的成长中也有儿时的淘气顽皮,学生时代的疑问与困惑,有获得成功时的泪水与喜悦,也有经历困难与挫折时的蹉跎与彷徨。甚至有经历人生最低潮时期的痛苦与煎熬。但是与众不同的是,李开复在成功中收获了经验,在失败中得到了成长。他把富有传奇的人生经历浓缩成为十句具有启发性的箴言,在如同与你交谈般的娓娓道来中,将这种宝贵的人生经验像冬日暖阳一样,洒满了整个房间。阅读全文
我想让我的电脑象服务器一样运行长时间开机
不过开久了玩魔兽这类稍微大点的游戏就开始卡了
答:很正常,尤其是大量使用交换文件的时候,时间长了内存和交换文件频繁存取,会变得零碎,影响了数据的存取。只要不是频繁的进行交换文件的读取操作,系统就会长时间运行


我一台普通电脑非服务器机器,XP sp3,当公司档案服务器。
平时没有人用,因公司性质需要7×24小时开机。
一开始连续开机3个多月没有问题,但是最近连续2天出现了同样的问题。
问题说明:
我公司客户端机器无法访问服务器,后查明是服务器当机。
表现形式为显示器黑屏,亮黄灯。主机电源灯亮,动鼠标没反应。
电源设置为5分钟关显示器,其他从不。
从起后一切正常。


还真没开过那么久的机器,楼主平时有时间维护机器么?如果没有那估计是过热吧,要定时维护的
感觉黑客是一种精神 而不是大家所说的这些东西!
至于用什么语言,这个不一定的,看目标是什么了?

锁定目标,寻找目标,以及获取Shell可能要非常多的方法,或许某些时候简单的JS都可以作为最厉害的武器!

讨论这样的东西其实根本就没有价值,黑客的目的是来维护网络的正常运作,寻找bug,修复bug,而不是商业的运用!

Linus Torvalds你说他是黑客吗?那你说他用什么语言呢? 一个合格的黑客首先是人格,其次才是一流的技术,包含对操作系统的理解,网络协议的理解,加密算法的理解,当然这个理解都是原理级别的。

  
锁定目标,寻找目标,获取shell,提升shell,保护shell,干净离开 这一系列的动作不是仅仅懂得某个语言或者精通C/C++就可以做得到的!

  
当然说这么多,只是希望学习开发的人正确自己的心态,想学是好的,但是我们离hacker还差太多太多,个人心目中,国内能算得上的黑客 只在政府,军队,部分高校,其他的只是商业的利用者!他们没有资格被称为黑客!

QQ游戏于前几日终于突破了百万人同时在线的关口,向着更为远大的目标迈进,这让其它众多传统的棋牌休闲游戏平台黯然失色,相比之下,联众似乎已经根本不是QQ的对手,因为QQ除了这100万的游戏在线人数外,它还拥有3亿多的注册量(当然很多是重复注册的)以及QQ聊天软件900万的同时在线率,我们已经可以预见未来由QQ构建起来的强大棋牌休闲游戏帝国。


  那么,在技术上,QQ游戏到底是如何实现百万人同时在线并保持游戏高效率的呢?
  事实上,针对于任何单一的网络服务器程序,其可承受的同时连接数目是有理论峰值的,通过C++中对TSocket的定义类型:word,我们可以判定这个连接理论峰值是65535,也就是说,你的单个服务器程序,最多可以承受6万多的用户同时连接。但是,在实际应用中,能达到一万人的同时连接并能保证正常的数据交换已经是很不容易了,通常这个值都在2000到5000之间,据说QQ的单台服务器同时连接数目也就是在这个值这间。
  如果要实现2000到5000用户的单服务器同时在线,是不难的。在windows下,比较成熟的技术是采用IOCP--完成端口。与完成端口相关的资料在网上和CSDN论坛里有很多,感兴趣的朋友可以自己搜索一下。只要运用得当,一个完成端口服务器是完全可以达到2K到5K的同时在线量的。但,5K这样的数值离百万这样的数值实在相差太大了,所以,百万人的同时在线是单台服务器肯定无法实现的。
  要实现百万人同时在线,首先要实现一个比较完善的完成端口服务器模型,这个模型要求至少可以承载2K到5K的同时在线率(当然,如果你MONEY多,你也可以只开发出最多允许100人在线的服务器)。在构建好了基本的完成端口服务器之后,就是有关服务器组的架构设计了。之所以说这是一个服务器组,是因为它绝不仅仅只是一台服务器,也绝不仅仅是只有一种类型的服务器。
  简单地说,实现百万人同时在线的服务器模型应该是:登陆服务器+大厅服务器+房间服务器。当然,也可以是其它的模型,但其基本的思想是一样的。下面,我将逐一介绍这三类服务器的各自作用。
  登陆服务器:一般情况下,我们会向玩家开放若干个公开的登陆服务器,就如QQ登陆时让你选择的从哪个QQ游戏服务器登陆一样,QQ登陆时让玩家选择的六个服务器入口实际上就是登陆服务器。登陆服务器主要完成负载平衡的作用。详细点说就是,在登陆服务器的背后,有N个大厅服务器,登陆服务器只是用于为当前的客户端连接选择其下一步应该连接到哪个大厅服务器,当登陆服务器为当前的客户端连接选择了一个合适的大厅服务器后,客户端开始根据登陆服务器提供的信息连接到相应的大厅上去,同时客户端断开与登陆服务器的连接,为其他玩家客户端连接登陆服务器腾出套接字资源。在设计登陆服务器时,至少应该有以下功能:N个大厅服务器的每一个大厅服务器都要与所有的登陆服务器保持连接,并实时地把本大厅服务器当前的同时在线人数通知给各个登陆服务器,这其中包括:用户进入时的同时在线人数增加信息以及用户退出时的同时在线人数减少信息。这里的各个大厅服务器同时在线人数信息就是登陆服务器为客户端选择某个大厅让其登陆的依据。举例来说,玩家A通过登陆服务器1连接到登陆服务器,登陆服务器开始为当前玩家在众多的大厅服务器中根据哪一个大厅服务器人数比较少来选择一个大厅,同时把这个大厅的连接IP和端口发给客户端,客户端收到这个IP和端口信息后,根据这个信息连接到此大厅,同时,客户端断开与登陆服务器之间的连接,这便是用户登陆过程中,在登陆服务器这一块的处理流程。
  大厅服务器:大厅服务器,是普通玩家看不到的服务器,它的连接IP和端口信息是登陆服务器通知给客户端的。也就是说,在QQ游戏的本地文件中,具体的大厅服务器连接IP和端口信息是没有保存的。大厅服务器的主要作用是向玩家发送游戏房间列表信息,这些信息包括:每个游戏房间的类型,名称,在线人数,连接地址以及其它如游戏帮助文件URL的信息。从界面上看的话,大厅服务器就是我们输入用户名和密码并校验通过后进入的游戏房间列表界面。大厅服务器,主要有以下功能:一是向当前玩家广播各个游戏房间在线人数信息;二是提供游戏的版本以及下载地址信息;三是提供各个游戏房间服务器的连接IP和端口信息;四是提供游戏帮助的URL信息;五是提供其它游戏辅助功能。但在这众多的功能中,有一点是最为核心的,即:为玩家提供进入具体的游戏房间的通道,让玩家顺利进入其欲进入的游戏房间。玩家根据各个游戏房间在线人数,判定自己进入哪一个房间,然后双击服务器列表中的某个游戏房间后玩家开始进入游戏房间服务器。
  游戏房间服务器:游戏房间服务器,具体地说就是如“斗地主1”,“斗地主2”这样的游戏房间。游戏房间服务器才是具体的负责执行游戏相关逻辑的服务器。这样的游戏逻辑分为两大类:一类是通用的游戏房间逻辑,如:进入房间,离开房间,进入桌子,离开桌子以及在房间内说话等;第二类是游戏桌子逻辑,这个就是各种不同类型游戏的主要区别之处了,比如斗地主中的叫地主或不叫地主的逻辑等,当然,游戏桌子逻辑里也包括有通用的各个游戏里都存在的游戏逻辑,比如在桌子内说话等。总之,游戏房间服务器才是真正负责执行游戏具体逻辑的服务器。
  这里提到的三类服务器,我均采用的是完成端口模型,每个服务器最多连接数目是5000人,但是,我在游戏房间服务器上作了逻辑层的限定,最多只允许300人同时在线。其他两个服务器仍然允许最多5000人的同时在线。如果按照这样的结构来设计,那么要实现百万人的同时在线就应该是这样:首先是大厅,1000000/5000=200。也就是说,至少要200台大厅服务器,但通常情况下,考虑到实际使用时服务器的处理能力和负载情况,应该至少准备250台左右的大厅服务器程序。另外,具体的各种类型的游戏房间服务器需要多少,就要根据当前玩各种类型游戏的玩家数目分别计算了,比如斗地主最多是十万人同时在线,每台服务器最多允许300人同时在线,那么需要的斗地主服务器数目就应该不少于:100000/300=333,准备得充分一点,就要准备350台斗地主服务器。
  除正常的玩家连接外,还要考虑到:
  对于登陆服务器,会有250台大厅服务器连接到每个登陆服务器上,这是始终都要保持的连接;
  而对于大厅服务器而言,如果仅仅有斗地主这一类的服务器,就要有350多个连接与各个大厅服务器始终保持着。所以从这一点看,我的结构在某些方面还存在着需要改进的地方,但核心思想是:尽快地提供用户登陆的速度,尽可能方便地让玩家进入游戏中。
分页: 204/272 第一页 上页 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 下页 最后页 [ 显示模式: 摘要 | 列表 ]