⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 网络在线游戏开发心得(服务器端、java) - gameres_com.htm

📁 网络游戏服务器开发的心得
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0071)http://dev.gameres.com/Program/Abstract/Design/OnlineGameServerJava.htm -->
<HTML><HEAD><TITLE>网络在线游戏开发心得(服务器端、Java) - GameRes.com</TITLE>
<META http-equiv=Content-Language content=zh-cn>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="DeHui Lin" name=Author>
<META content=中国最大的游戏业内交流平台,提供游戏制作资讯,面向游戏开发者、游戏公司 name=DEscription>
<META 
content="游戏开发,游戏制作,游戏研发,网络游戏,Game Develop,Game Resource,GameMake,游戏,游戏教育,手机游戏,游戏程序,游戏策划,资源下载,电子书籍,GBA,游戏机,电脑,编成,开发,技术,C,C++,VB,DX,DirectX,DirectDraw,D3D,Direct3D,DirectShow,DirectSound,DirectMusic,DirectShow,OpenGL,GPU,优化" 
name=KEYWords>
<STYLE>.NewsContent2 {
	FONT-SIZE: 14px; LINE-HEIGHT: 140%
}
</STYLE>

<META content="MSHTML 6.00.2800.1491" name=GENERATOR></HEAD>
<BODY text=#4a4108 vLink=#9c0000 aLink=#9c0000 link=#9c0000 bgColor=#ded3bd 
leftMargin=0 topMargin=0><FONT face=Arial>
<DIV align=center>
<TABLE id=AutoNumber1 style="BORDER-COLLAPSE: collapse" borderColor=#111111 
cellPadding=0 width="98%" border=0>
  <TBODY>
  <TR>
    <TD width="100%"><FONT size=2><A title="GameRes - 华语游戏开发资讯专业站点" 
      href="http://www.gameres.com/"><IMG height=38 
      src="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/Doc_Title.gif" width=150 
      border=0></A></FONT></TD></TR>
  <TR>
    <TD width="100%"> </TD></TR>
  <TR>
    <TD width="100%">
      <TABLE id=table1 style="BORDER-COLLAPSE: collapse" cellPadding=0 
      width="100%" border=0>
        <TBODY>
        <TR>
          <TD width=24><IMG height=24 
            src="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/left_top.gif" 
            width=24 border=0></TD>
          <TD 
            background="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/top.gif"><B><FONT 
            size=2>技术文档(Document)</FONT></B></TD>
          <TD width=31><IMG height=24 
            src="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/right_top.gif" 
            width=31 border=0></TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD width="100%">
      <TABLE id=table2 style="BORDER-COLLAPSE: collapse" cellPadding=0 
      width="100%" border=0>
        <TBODY>
        <TR>
          <TD width=21 
          background="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/left.gif"> </TD>
          <TD bgColor=#f7ebde>
            <P align=right><FONT size=2><SPAN 
            style="FONT-FAMILY: 宋体">作者:Bromon&nbsp; 来自:<A 
            href="http://blog.csdn.net/bromon/archive/2005/01/14/253330.aspx">Sometimes 
            Java</A></SPAN></FONT></P></TD>
          <TD width=24 
          background="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/right.gif"> </TD></TR>
        <TR>
          <TD width=21 
          background="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/left.gif"> </TD>
          <TD bgColor=#f7ebde>
            <P align=center><B><FONT 
            color=#000000>网络在线游戏开发心得(服务器端、Java)</FONT></B></P></TD>
          <TD width=24 
          background="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/right.gif"> </TD></TR>
        <TR>
          <TD width=21 
          background="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/left.gif"> </TD>
          <TD bgColor=#f7ebde><FONT 
            class=NewsContent2><BR>  一个多人在线的棋牌类网络游戏的项目临近尾声,我参与了该项目的整个设计流程,并且完成了90%的核心代码。关于这个项目,有很多地方值得聊一聊。本系列不打算把这个项目将得多么详细规范,那是设计文档应该描述的,我打算只说说一些值得注意的地方。<BR><BR>  这个项目的一个特别之处是,客户端是手机,用户通过移动网络与服务器通信。和PC相比,手机的处理能力极弱,而且网络流量费用昂贵。因为除了要考虑普通网络游戏的一些问题之外,这两点也需要在设计中充分考虑。<BR><BR>  首先是开发语言的选择,由于服务器是Linux的环境,MS的技术直接排除,至于MONO嘛,我实在不放心。可供选择的是C++和Java,Java胜在网络能力强大,开发周期短,有众多框架和开源库的支持,要写出烂得不可接受的代码也不容易;C++则胜在速度快。综合各方面因素,C++更容易把这个项目变成一堆代码噩梦,我们选择了Java。<BR><BR><BR><B>一、网络</B><BR><BR>  网络游戏,首先面临的问题当然是如何进行网络通信。首先考虑的是HTTP协议,因为所有的J2ME手机都支持这个,我们当然想尽可能的兼容用户。而且HTTP协议封装程度已经非常高了,不用去考虑线程、同步、状态管理、连接池,不过HTTP协议有两个不爽的地方:<BR><BR>  ◇ 
            协议无状态,这个问题已经困扰过很多人很多次了。我曾考虑过的解决办法是改造HTTP协议,在数据传输完成之后不关闭socket,但是这样做工作量非常大,在项目周期中,基本上就是Mission 
            impossible,不予考虑。那么客户也就只能通过轮询的方式向服务器请求数据。<BR><BR>  ◇ 
            网络流量过大。就这个项目来说,网络间传递的只是指令,但是每次传递都要加上一堆毫无用处的HTTP 
            Head,再加上客户端需要做轮询,这个流量对于手机来说简直恐怖,经简单测试,按照0.03元/K的GPRS网络费用计算,一局牌居然要消耗1元多的费用(每秒轮询),实在不可接受。也许我们可以采用流量费包月的资费方式,不过这个话题与技术无关。<BR><BR>  以上问题导致我们选择了Socket,这意味着我们将没有一个web环境,很多东西都要靠自己去实现:线程管理、客户状态监控、对象池、控制台……….<BR><BR>  网络部分打算采用Java 
            NIO来实现,这是一种新的网络监听方式,基于事件的异步通信,可以提高性能。每个客户端连接之后,会有一个独立的SocketChannel与它通信,这个SocketChannel会在用户的整个生存周期中存在。用户如果断开连接,服务器会得到-1,并且会抛出Connection 
            reset异常,通过捕获这两个特征,可以在用户意外断开连接后清理相关的资源。由于NIO是异步通信的,所以没有复杂的线程管理。<BR><BR><BR><B>二、通信协议</B><BR><BR>  这个项目并没有复杂的通信指令,命令数量很有限,但是还是有个关键问题需要关注:流量。为了尽量减小流量,我们使用字节代替字符串来保存系统指令,这样可以使流量减少一半,比如使用一个字节来保存一张扑克牌,字节高位表示花色,字节低位表示数字,如果0代表黑桃,那么黑桃三就应该是0x03,这个需要靠位操作来实现:<BR><BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>int m=0;<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>int n=3;<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>byte 
            card=(byte)(m)&lt;&lt;4)|((byte)n; 
            //m左移四位,然后与n左或操作<BR><BR>  游戏中需要传递用户的积分,这是一个大整数,使用四个字节来保存比较保险,将整数转换为四个字节的操作如下:<BR><BR>public 
            static byte[] translateLong(long mark)<BR>{<BR>&nbsp;&nbsp;&nbsp; 
            byte[] b = new byte[4];<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>for (int i = 0; i &lt; 4; i++)<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>{<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>b[i] = 
            (byte) (mark &gt;&gt;&gt; (24 - i * 8));<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>}<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>return 
            b;<BR>}<BR><BR>  将四个字节转回来的操作如下:<BR><BR>public static long 
            translateByte(byte[] b)<BR>{<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>int mask = 0xff;<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>int temp = 0;<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>int res = 0;<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>for (int i = 0; i &lt; 4; i++)<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>{<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>res 
            &lt;&lt;= 8;<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>temp = 
            b[i] &amp; mask;<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT>res |= 
            temp;<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; </FONT>}<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>return 
            res;<BR>}<BR><BR><BR><B>三、数据库连接池</B><BR><BR>  由于没有一个web环境,所以我们需要自己实现一个数据库连接池,apache有一个项目叫做commons 
            DBCP,这是一个基于apache自己的对象池(apache commons 
            pool)实现的数据库连接池,我们可以直接拿来使用,apache的软件未必是最好的,但是极大可能比我们自己写的要好。<BR><BR>Commons 
            DBCP需要三个.jar:<BR><BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>commons-collections-3.1.jar、commons-dbcp-1.2.1.jar、commons-pool-1.2.jar<BR><BR>这三个文件都可以在apache 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -