一个多人在线的棋牌游戏的网络项目临近尾声,我参与了该项目的整个设计流程,并且完成了90%的核心代码。关于这个项目,有很多地方值得聊一聊。
视频教学

零代码快速开发手机APP程序教学视频 谁都会

本系列不打算把这个项目将得多么详细规范,那是设计文档应该描述的,我打算只说说一些值得注意的地方。这个项目的一个特别之处是,客户端是手机,用户通过移动网络与服务器通信。和PC相比,手机的处理能力极弱,而且网络流量费用昂贵。因为除了要考虑普通网络游戏的一些问题之外,这两点也需要在设计中充分考虑。首先是开发语言的选择,由于服务器是Linux的环境,MS的技术直接排除,至于MONO嘛,我实在不放心。可供选择的是C++和Java,Java胜在网络能力强大,开发周期短,有众多框架和开源库的支持,要写出烂得不可接受的代码也不容易;C++则胜在速度快。综合各方面因素,C++更容易把这个项目变成一堆代码噩梦,我们选择了Java。

一、网络
网络游戏,首先面临的问题当然是如何进行网络通信。首先考虑的是HTTP协议,因为所有的J2ME手机都支持这个,我们当然想尽可能的兼容用户。而且HTTP协议封装程度已经非常高了,不用去考虑线程、同步、状态管理、连接池,不过HTTP协议有两个不爽的地方:
  ◇ 协议无状态,这个问题已经困扰过很多人很多次了。我曾考虑过的解决办法是改造HTTP协议,在数据传输完成之后不关闭socket,但是这样做工作量非常大,在项目周期中,基本上就是Mission impossible,不予考虑。那么客户也就只能通过轮询的方式向服务器请求数据。
  ◇ 网络流量过大。就这个项目来说,网络间传递的只是指令,但是每次传递都要加上一堆毫无用处的HTTP Head,再加上客户端需要做轮询,这个流量对于手机来说简直恐怖,经简单测试,按照0.03元/K的GPRS网络费用计算,一局牌居然要消耗1元多的费用(每秒轮询),实在不可接受。也许我们可以采用流量费包月的资费方式,不过这个话题与技术无关。
  以上问题导致我们选择了Socket,这意味着我们将没有一个web环境,很多东西都要靠自己去实现:线程管理、客户状态监控、对象池、控制台……….网络部分打算采用Java NIO来实现,这是一种新的网络监听方式,基于事件的异步通信,可以提高性能。每个客户端连接之后,会有一个独立的SocketChannel与它通信,这个SocketChannel会在用户的整个生存周期中存在。用户如果断开连接,服务器会得到-1,并且会抛出Connection reset异常,通过捕获这两个特征,可以在用户意外断开连接后清理相关的资源。由于NIO是异步通信的,所以没有复杂的线程管理。

二、通信协议
这个项目并没有复杂的通信指令,命令数量很有限,但是还是有个关键问题需要关注:流量。为了尽量减小流量,我们使用字节代替字符串来保存系统指令,这样可以使流量减少一半,比如使用一个字节来保存一张扑克牌,字节高位表示花色,字节低位表示数字,如果0代表黑桃,那么黑桃三就应该是0x03,这个需要靠位操作来实现:

博狗教你写棋牌类游戏相关推荐

  1. Android游戏开发教程:手教你写跳跃类游戏

    Android游戏开发教程:手教你写跳跃类游戏 package jumpball.game; import android.app.Activity; import android.os.Bundle ...

  2. C# 写的棋牌类游戏(全源码)。

    C# 写的棋牌类游戏(全源码) http://d.namipan.com/d/b47c1bb0ed558e95c85313ba845e57ddad98b70568aa6704 有兴趣的开发者可以下载看 ...

  3. 棋牌类游戏算法–牌分类_快速分类–三向和双枢轴

    棋牌类游戏算法–牌分类 毫无疑问,Quicksort被认为是本世纪最重要的算法之一,并且它是许多语言的事实上的系统排序,包括Java中的Arrays.sort . 那么,quicksort有何新功能? ...

  4. unity跑酷怎么添加金币_【Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版)...

    在两个月前曾写了一篇<[Unity3D实战]零基础一步一步教你制作跑酷类游戏(1)>,里面一步一步演示了制作跑酷类游戏,然而由于时间原因,只写到了让角色往前移动为止.这个坑一直没有时间去填 ...

  5. 棋牌类游戏服务器架构全面总结

    一.棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间 ...

  6. 【Unity3D实战】零基础一步一步教你制作跑酷类游戏

    原转载自 https://blog.csdn.net/sun15980/article/details/51093048 ,已失效 新 [Unity3D开发小游戏]Unity3D零基础一步一步教你制作 ...

  7. 使用Delphi编写棋牌类游戏 – 设计篇(3)

    最近几天正在找工作,所以更新BLOG晚了一些.今天在老婆的催促下终于要更新了. 通过以上两篇关于对中心服务器和登录服务器设计的阐述,大家应该对设计它们有了一定的了解.但是中心服务器和登录服务器毕竟是游 ...

  8. 斗地主棋牌类游戏中的洗牌和发牌算法

    前言 洗牌和发牌是棋牌类游戏中,非常重要的两个关键节点,而这两个关键节点涉及的算法,很多同学非常感兴趣,今天,我们就以NodeJS环境为例,通过JS代码给大家解说洗牌和发牌算法. 一. 洗牌算法 1. ...

  9. 棋牌类游戏的开发心得

    一个多人在线的棋牌类网络游戏的项目临近尾声,我参与了该项目的整个设计流程,并且完成了90%的核心代码.关于这个项目,有很多地方值得聊一聊.本系列不打算把这个项目将得多么详细规范,那是设计文档应该描述的 ...

最新文章

  1. 【UIKit】UIAlertController使用
  2. 简明python教程 --C++程序员的视角(六):输入输出IO
  3. 前端学习(479):html简介
  4. android viewpage预加载和懒加载问题
  5. Outlook 2013 电子邮件账户设置备份与恢复
  6. cpp怎么转成html,如何编辑HTML(标签),通过CppWebBrowser
  7. html段落自动删除,利用JS代码自动删除稿件的普通弹幕功能
  8. java静态方法没有this,super与this无法用在static方法中
  9. 基于matlab 的电力系统潮流仿真
  10. vscode Java语法检查_vscode eslint js代码检查工具
  11. python blp模型 估计_随机系数Logit模型及Stata实现
  12. 基于树莓派的智能门禁及3D外壳打印设计
  13. 从单目视觉信息学习深度信息(一)
  14. showdown解析md文件
  15. element-ui 点击Switch开关弹出对话框确认后再改变switch开关状态
  16. java-通信-ip-1
  17. 【Beetl笔记整理二】定义变量
  18. P1567 统计天数 python代码
  19. JavaEE - 集合 - Map集合
  20. linux 清理磁盘 dev sda2,linux /dev/sda1 磁盘满了,解决办法

热门文章

  1. python 广告牌_抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位...
  2. Java Scanner用法
  3. BUUCTF RE WP36-38 [FlareOn4]IgniteMe、[MRCTF2020]Xor、[MRCTF2020]hello_world_go
  4. 国内源安装Homebrew
  5. FPGA数字信号处理(一)数字混频(NCO与DDS的使用)
  6. 5g工程师需要什么学历?
  7. jqGrid组件显示滚动条
  8. SpringBoot实现短信发送
  9. pinyin4j的基础使用
  10. 中职汽修专业计算机测试卷,汽修专业面试问题及答案