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

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

📁 网络游戏服务器开发的心得
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            – Jakarta – 
            commons项目下下载,加入到工程中即可。<BR><BR>构造一个数据库连接池的代码如下:<BR><BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>import java.sql.*;<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>import 
            com.gwnet.games.antiLord.util.*;<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>import 
            org.apache.commons.dbcp.ConnectionFactory;<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>import 
            org.apache.commons.dbcp.BasicDataSource;<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>import 
            org.apache.commons.dbcp.DataSourceConnectionFactory;<BR><BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>private static BasicDataSource 
            bds=new BasicDataSource();<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>private static ConnectionFactory fac=null;<BR><BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>//初始化连接池<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>bds.setDriverClassName(“org.postgresql.Driver”); 
            //数据库驱动程序<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>bds.setUrl(“jdbc:postgresql://localhost:5432/myDB”); 
            //数据库url<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>bds.setUsername(“postgres”); //dba帐号<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>bds.setPassword(“XXXXXXXX”); 
            //密码<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>bds.setInitialSize(100); //初始化连接数量<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>bds.setMaxIdle(10); 
            //最大idle数<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>bds.setMaxWait(1000*60); //超时回收时间<BR><BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>fac=new 
            DataSourceConnectionFactory(bds); //得到连接工厂<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>Connection 
            conn=fac.createConnection(); //从池中获得连接<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>conn.close(); 
            //释放连接,回到池中<BR><BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>//销毁连接池<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>bds.close();<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>bds=null;<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>fac=null;<BR><BR>请自行处理操作中的各种异常。<BR><BR><BR><B>四、扑克牌的生成</B><BR><BR>  游戏中需要为用户生成随机的扑克牌,首先我们需要初始化一副牌,放到一个Hashmap中,每张牌以一个字节表示,高为代表花色,的为代表数字,生成整副牌:<BR><BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>private static HashMap cards = 
            new HashMap();<BR><BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; </FONT>int 
            tmp=0;<BR>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt;4; i++) 
            {<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </FONT>for (int m = 0; m &lt; 13; m++) {<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </FONT>tmp=((byte)(i)&lt;&lt;4)|((byte)m); //使用位操作构造一张牌<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </FONT>cards.put(new Integer(i * 13 + m),new 
            Byte((byte)tmp));<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </FONT>}<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>}<BR><BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>cards.put(new Integer(53), new Byte((byte)0x4d)); 
            //大王<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; </FONT>cards.put(new 
            Integer(54), new Byte((byte)0x4e)); 
            //小王<BR><BR>  如何随机地得到其中的N张牌呢?我们的做法是生成一个0-55的随机数,用这个随机数作主键从Hashmap中获得对象,取得之后,把该对象从队列中删除,以免重复取得。由于java中的随机数是根据时间生成的,所以有可能导致用户得到的牌不够散,每个用户都摸到一条龙岂不是笑话?所以在生成随机数的时候我们加入了一个大素数来作运算:<BR><BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; </FONT>long cardId=new 
            Long((Math.round(Math.random() * 87) % 
            55)).intvalue();<BR><BR>通过修改这个大素数,可以控制某个用户的牌比较好。<BR><BR><BR><B>五、线程</B><BR><BR>  实际上本系统并没有复杂的线程管理,但是我想提供一个控制台让管理员可以管理游戏主线程,可以让它停止、中段、恢复、重启动,本来的设计是管理员通过与线程A打交道,通过A去管理主线程B,但是熟悉java线程的朋友都知道,线程互相管理基本上就是不实际的,举个最简单的例子,A如何销毁B?也许你会说调用B的destroy()方法就好了,网上很多讲解java线程的资料也确实是这么说的,但是他们都是鬼扯的,自己去看看java源代码吧,Thread.destroy()方法的实际代码如下:<BR><BR>public 
            void destroy() <BR>{<BR>&nbsp;&nbsp;&nbsp; throw new 
            NoSuchMethodError();<BR>}<BR><BR>  事实真相是,Thread.destroy()方法自始至终就没有被实现过。所有写文章,教别人用这个方法销毁线程的人,都去撞墙吧,丢人丢大了。<BR><BR>  最好的办法是A负责生成一个B并且启动它,然后B自己管理生存周期,A和B通过使用可共享的方法来通信,这是sun推荐的做法。<BR><BR><BR><B>六、异步消息</B><BR><BR>  用户玩牌的过程中,有很多东西需要记录下来,比如记录用户的积分、等级变化,记录玩牌日志供数据统计等,当用户数量很多的时候,在数据库中记录这些信息会很耗费资源,用户玩了一局之后会可能会等待很长时间。解决这个问题的方法是利用J2EE的消息bean来提供异步通信的机制,需要记录数据的时候,系统会封装一个值对象,发送给J2EE容器,这个操作是很快的,完成之后就返回,用户可以继续操作,不用关心消息何时被处理。<BR><BR>  J2EE的消息框架具备如下特征:<BR><BR>◇ 
            消息一定会被阅读,而且只阅读一次。JMS框架有自己的算法,把消息缓冲到硬盘,就算J2EE服务器死掉,消息也不会丢失。<BR><BR>◇ 
            系统采用点对点的Queue消息队列,可以保证同等优先级的消息先进先出。<BR><BR>  在Jboss 
            4.0中,部署消息Bean和Queue队列,都比weblogic 
            8.1来的容易,只需要在jboss.xml中声明消息目的地,如果jboss发现该目的地不存在的话,会自动建立一个,实在很简单。关于消息bean的开发与部署,我有专门的文章描述(参见我的blog:<A 
            href="http://blog.csdn.net/bromon">http://blog.csdn.net/bromon</A> 
            )。<BR><BR><BR><B>七、启动与退出</B><BR><BR>  为了让系统具备让人满意的性能,应该尽量多的重用对象,减少创建新对象。比如上面提到的消息发送,我们的操作是提供一个静态类,在系统启动的时候就初始化,保持与JMS服务器的连接,系统发送消息的时候,不用再去查询JNDI和生成QueueConnectionFactory,这样可以提高系统响应速度。<BR><BR>  在数据库连接池的问题上,我们也采用同样的操作,启动的时候初始化N个连接。但是如果在关闭进程的时候不做任何操作,会导致JMS抛出socket异常,虽然没什么大的影响,但总显得不专业,而且池中的连接不被释放的话,也可能导致问题。最好能够让系统像jboss等控制台程序一样,ctrl+c之后能够执行操作,释放资源再退出。我们可以通过给进程/线程加上一个Hook来实现,windows程序员应该对这个非常熟悉。<BR><BR>Hook应该是一个线程方法,如下:<BR><BR>public 
            class Hook extends Thread<BR>{<BR>&nbsp;&nbsp;&nbsp; public void 
            run()<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; </FONT>{<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </FONT>//释放数据库连接,销毁连接池<BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            </FONT>//关闭与JMS的连接<BR><FONT face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>}<BR>}<BR><BR>在主线程中加入:<BR><BR><FONT 
            face=Arial>&nbsp;&nbsp;&nbsp; 
            </FONT>Runtime.getRuntime().addShutdownHook(new Hook()) 
            ;<BR><BR>那么进程/线程会在退出的时候执行Hook的run方法,清理资源。</FONT></TD>
          <TD width=24 
          background="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/right.gif"> </TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD width="100%">
      <TABLE id=table3 style="BORDER-COLLAPSE: collapse" cellPadding=0 
      width="100%" border=0>
        <TBODY>
        <TR>
          <TD width=24><IMG height=24 
            src="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/left_bottom.gif" 
            width=24 border=0></TD>
          <TD 
            background="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/bottom.gif">&nbsp; 
          </TD>
          <TD width=24><IMG height=24 
            src="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/right_bottom.gif" 
            width=24 border=0></TD></TR></TBODY></TABLE></TD></TR>
  <TR>
    <TD width="100%">
      <FORM>
      <P 
      align=right><INPUT onclick=window.close() type=button value="关 闭 窗 口">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </P></FORM></TD></TR>
  <TR>
    <TD width="100%">
      <P align=center><BR><FONT 
      size=2>本站中所有文章以及图形均为作者本人、公司所有,本站所有资讯仅供参考,若有任何损失本站概不负责,请自行斟酌。<BR>Copyright 
      &copy; 2001-2005 游戏开发资源网(<A href="http://www.gameres.com/">GameRes.com</A>) All 
      Rights reserved.<BR>This site is optimized for at least 1024x768 
      resolution (hi-color) viewing with a browser that supports style 
      sheets.<BR>
      <SCRIPT 
      src="网络在线游戏开发心得(服务器端、Java) - GameRes_com.files/mystat.htm"></SCRIPT>
      <BR> </FONT></P></TD></TR></TBODY></TABLE></DIV></FONT></BODY></HTML>

⌨️ 快捷键说明

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