网络在线游戏开发心得( 服务器端、 Java) 一个多人在线的棋牌类网络游戏的项目临近尾声, 我参与了该项目的整个设计流程, 并且完成了 90% 的核心代码。关于这个项目, 有很多地方值得聊一聊。本系列不打算把这个项目将得多么详细规范, 那是设计文档应该描述的,我打算只说说一些值得注意的地方。这个项目的一个特别之处是,客户端是手机,用户通过移动网络与服务器通信。和 PC 相比,手机的处理能力极弱,而且网络流量费用昂贵。因为除了要考虑普通网络游戏的一些问题之外, 这两点也需要在设计中充分考虑。首先是开发语言的选择, 由于服务器是 Linux 的环境, MS 的技术直接排除,至于 MONO 嘛,我实在不放心。可供选择的是 C++ 和 Java , Java 胜在网络能力强大, 开发周期短, 有众多框架和开源库的支持, 要写出烂得不可接受的代码也不容易; C++ 则胜在速度快。综合各方面因素, C++ 更容易把这个项目变成一堆代码噩梦, 我们选择了 Java 。一、网络网络游戏,首先面临的问题当然是如何进行网络通信。首先考虑的是 HTTP 协议, 因为所有的 J2ME 手机都支持这个, 我们当然想尽可能的兼容用户。而且 HTTP 协议封装程度已经非常高了,不用去考虑线程、同步、状态管理、连接池,不过 HTTP 协议有两个不爽的地方: ◇协议无状态, 这个问题已经困扰过很多人很多次了。我曾考虑过的解决办法是改造 HTTP 协议,在数据传输完成之后不关闭 socket , 但是这样做工作量非常大,在项目周期中,基本上就是 Mission impossible , 不予考虑。那么客户也就只能通过轮询的方式向服务器请求数据。◇网络流量过大。就这个项目来说, 网络间传递的只是指令, 但是每次传递都要加上一堆毫无用处的 HTTP Head ,再加上客户端需要做轮询,这个流量对于手机来说简直恐怖,经简单测试,按照 元/K的 GPRS 网络费用计算, 一局牌居然要消耗 1 元多的费用( 每秒轮询),实在不可接受。也许我们可以采用流量费包月的资费方式,不过这个话题与技术无关。以上问题导致我们选择了 Socket , 这意味着我们将没有一个 web 环境, 很多东西都要靠自己去实现: 线程管理、客户状态监控、对象池、控制台………. 网络部分打算采用 Java NIO 来实现,这是一种新的网络监听方式, 基于事件的异步通信, 可以提高性能。每个客户端连接之后, 会有一个独立的 SocketChannel 与它通信, 这个 SocketChannel 会在用户的整个生存周期中存在。用户如果断开连接, 服务器会得到-1, 并且会抛出 Connection reset 异常,通过捕获这两个特征,可以在用户意外断开连接后清理相关的资源。由于 NIO 是异步通信的, 所以没有复杂的线程管理。二、通信协议这个项目并没有复杂的通信指令,命令数量很有限,但是还是有个关键问题需要关注: 流量。为了尽量减小流量, 我们使用字节代替字符串来保存系统指令, 这样可以使流量减少一半, 比如使用一个字节来保存一张扑克牌, 字节高位表示花色, 字节低位表示数字, 如果 0 代表黑桃,那么黑桃三就应该是 0x03 ,这个需要靠位操作来实现: int m=0; int n=3; byte card=(
网络在线游戏开发心得(服务器端、Java) 来自淘豆网m.daumloan.com转载请标明出处.