`
jcs130
  • 浏览: 129450 次
  • 性别: Icon_minigender_1
  • 来自: Ottawa
社区版块
存档分类
最新评论

编程菜鸟看云计算、移动互联网和物联网

阅读更多

通过联机黑白棋看云计算、移动互联网和物联网

一、联机黑白棋

终于把通信的一个小项目——联机版的黑白棋做出来了~

说来真是惭愧,本来在暑假结束的时候就应该去做的,但是~(╯▽╰)

先来说说黑白棋吧:

胡老师说:不要在没做一件事之前抱怨这件事有多么难做。

好吧,现在我基本上做完了,说一下,其实不是想我想象中的那么简单……

其实在做完人机对战的黑白棋后,做联机版应该已经不成问题,只需要把自己写的机器人的那个类换成一个客户端\服务器就可以了,不过说的简单,在真正实现的时候还是遇到了些问题,我先来说一下这个黑白棋的实现步骤吧:

1.在暑假结束的时候已经做出来了一个简单的聊天工具,实现了基本的文字聊天功能,联机黑白棋程序就是在这个基础上编写的。


2.选择通信模式:其实当时没有做这个程序就是卡在了通信模式的选择上,当时的想法是很多客户端连接服务器,然后再通过服务器对多个客户端的信息进行转发,达到多人同时游戏的目的,但是这样有点“还没学会走就想跑”的味道……前几天再写的时候我选择了另外一种模式,服务器和客户端一一对应的模式,这样相对前一种比较容易实现,而且下棋也只需要两个人,所以这样做也没什么问题。

3.写服务器端:先写出一个选择当主机还是客户机的选择界面,就像以前玩的CS局域网对战一样,建立服务器的人也参加游戏,修改相应的地方(说得简单啊……),然后写一个模拟的客户端,与服务器进行通信。




 

4.重写客户端,编写界面,修改监听器内的方法(遇到的问题后面有说明)。

我觉得难点主要是两个:

1.如何等待对方下子,我是直接写了一个死循环,当收到对方传来的数据的时候再跳出循环,执行下一步,

	int[] a = new int[2];
	public int[] Xiazi() {
		int n = 0;
		// 接受发过来的数据,返回数据
		while (true) {
			while (true) {
				if (readFromServer()) {
					break;
				}
			}
			a[n] = input;
			n++;
			if (n == 2) {
				break;
			}

			try {
				Thread.sleep(25);// 沉睡时间
			} catch (Exception ef) {
				ef.printStackTrace();
			}
		}
 

这应该是一个最粗糙的解决方法了,最直接的后果是在等待的期间程序完全卡死,如果对方程序关闭会持续报错


我想到的解决方法就是单独起一个线程去检接收数据,如果没有接收到数据就移除界面上的鼠标监听器,一旦接到数据再把监听器加上去。

2.先后手问题:为了方便,我默认主机为黑子,先手,客户机为白子,后手。先手好办,但是如何实现客户机等待主机是个问题。我的做法是在客户端运行的时候先有一个死循环来接收服务器的坐标信息,然后再向下执行,但是如果把这个死循环直接放在显示界面(ShowUI)方法里面的话,界面会没有显示,所以我就把这两个步骤(显示界面&循环等待)放在一个线程里面,这样他们就可以不相互干扰了(在我看来一个窗体对象就和一个线程差不多,他的入口可能就是我们写的那个ShowUI的方法吧,这个的工作原理以后再深入的去了解吧~

	/**
	 * 线程入口
	 */
	public void run() {
		showUI();
		// 第一次接收
		int x[];
		System.out.println("等待对方……");
		x = rb.Xiazi();
		int m = x[0];
		int n = x[1];
		System.out.println("黑棋下的位置为:" + m + "  " + n);
		shuju.chesses[m][n] = 1;// 为黑子
		System.out.println("改变数据");
		// 改变中间子颜色
		CL.hengYou1(m, n);
		CL.hengZuo1(m, n);
		CL.hengShang1(m, n);
		CL.hengXia1(m, n);
		CL.Check(-1);
		// 更新显示
		jp.paint(jp.getGraphics());
		// 添加监听器
		jp.addMouseListener(CL);
	}
 

二、云计算

可能你要问了,这么一个小游戏怎么能和云计算扯上关系呢?那就让我来说一下吧~

黑白棋和五子棋不同,黑白棋每次落子后会改变棋盘上的棋子,而五子棋只需要判断是否五个棋子相连就可以了。这样的话那就有一个问题要考虑了:判断的工作交给谁来做?有两种方法:1.让客户端自己判断,再将最后的坐标发送出去;2.把原始数据(鼠标每次点击的坐标)全部发给服务器,让服务器进行判断,服务器再把结果返回给客户机。

两种方法各有优劣,第一种方法会让客户基于服务器之间的通信数据变少,而且可以减轻服务器的压力(服务器只需要做一个数据传递转发的作用),但是这样会让客户端的计算压力加大;而第二种方法客户端几乎不用做任何的计算工作,只需要把服务器发来的信息显示出来就好了,但相应的这么做会对带宽以及服务器的性能要求很大。

再举个例子:大家都玩过网络游戏吧,现在的网络游戏几乎都是通过第一种方式实现的,我做过一个“实验”,我玩《龙之谷》的时候因为家里没有固话,也就没有宽带,我就用3G上网卡玩,当时我以为像这样的大型网络游戏要花费很大的流量,但是当我玩了一个多小时后,发现只用了几兆的流量。我想这就是因为在玩游戏的时候客户端只用向服务器发送例如玩家坐标,聊天内容等数据,这些数据都是很小的,而服务器向客户端返回其他玩家的一些信息,其他的工作,例如渲染画面,物理计算等工作都是由客户端来完成,我想这也就是为什么《龙之谷》的客户端大小有3GB之多(里面存着各种人物造型、时装、武器、地图等的3D模型数据或者是贴图,这也就是网上那些修改角色外观的补丁包的原理了,只需要把相应的文件替换掉就可以),而且对于电脑配置的要求比较高(需要电脑对画面进行渲染)的原因了。

 

这种方式可以节省带宽(国内普遍还在用着1M的带宽)降低延迟,但是如果你想玩一个画质好的游戏的话,需要一台配置足够强筋的电脑才可以。但是如果你真有了这么一台电脑,你会一天24小时让他工作在满负荷运行的状态(CPU使用率100%)下么?显然不可以,这样那些为了玩一个游戏而花钱购买的那些冗余性能不就是浪费了么。这就形成了一个矛盾:我们需要电脑拥有强大的计算能力去执行一些特定的应用,但是这些应用并不是时时刻刻都需要,而在不需要的时候,那些闲置的计算能力就浪费掉了。

云计算的出现就是为了解决这个矛盾。也是我所说的那第二种方法——把判断交和计算给服务器去做,客户端只显示结果。

举个例子,如果用第二种方法,我们再玩游戏的时候客户端只需要鼠标键盘之类的输入设备,显示器耳机之类的输出设备和一台可以联网的电脑就可以了,而这台电脑的性能不需要太高,只需要能够播放电影就行了。为什么呢?因为客户机只需要向服务器发送用户输入的原始数据,然后这些原始数据经过在服务器端的处理,变成一幅幅的游戏画面,直接通过网络再返回到客户端,客户端再把这些画面显示出来就可以了。不过这就像我前面说的,需要很高的带宽以及高性能的服务器。不过这两个问题现在看来几乎不是问题:在我们还在用着2M带宽,看着那一百多的下载速度而着急的时候,国外的带宽已经上了两位数……而服务器性能方面,一面intelAMD争相发布性能更高的处理芯片,另一方面网格计算、分布式计算等技术的不断完善,也使服务器集群(云)的运算能力上了一个大台阶。

可能有些同学对于游戏不怎么感冒,那就再举个例子,就拿我们那个“千年进一回”的教务管理系统来说,据说我们的教务系统有8台服务器,假设每台服务器1万元,一台服务器可以同时被500个客户端连接,那就是可以同时让4000个同学使用,然而在不选课的时候,谁会去上教务网啊?顶多去查个课表什么的,这样连接的人就会很少,服务器的多余的性能就被浪费掉了,而到了选课的时候,可能会有8000个同学(需要16台服务器)需要使用,如果不增加服务器的话那肯定会有很多人连接不上,如果去增加的话,那选完课以后那些新买的服务器不也是在那里浪费么。但是如果实现了云计算的话,情况就大不一样了:学校只需要购买两台服务器来维持日常的访问,等到了像选课这样的访问量高峰时期再从云计算服务商(国内的阿里巴巴、腾讯等IT公司都有自己的云服务器)那里“租借”另外14台服务器的计算能力,而这个租借的费用显然会比自己去买来的划算。

不过以上这些都是说起来容易做起来难,虽然技术上这样可行(在实验室中已经实现),但是落实到细节上:还存在如何保证在数据传输过程中的安全?如何防止被别人截获?还有就是租借协议的制定以及相关法律法规的完善以及国内互联网基础设施等问题,所以云计算实现起来还是要走一段路。

三、移动互联网和物联网

说到移动互联网我们最先想到的就是手机了,几年前,我们还在为自己拥有一款可以挂QQ的诺基亚直板手机而感到满足,可是现在,1Ghz主频处理器的手机满天飞,甚至还有“四核”的手机。可以说现在我的手机的性能甚至比我们家98年的586电脑的性能都好了。这些都是因为人们对于移动计算的需求越来越高。可是高配置带来的代价是高价格低续航,现在不是流行一句话么“用安卓的男人都是好男人,因为他们必须每天回家充电。”

那么强大的性能是用来干什么的,其实我们需要那么强大的性能只是因为我们想在无聊的时候可一切切水果(水果忍者)打打鸟(愤怒的小鸟)。那在我们不用这些高需求的应用的时候呢?那些冗余的性能亦或是宝贵的续航时间就被我们浪费掉了。

但是如果用云计算的思路来解决这个问题呢?手机只需要一个基本的性能,当需要更高性能的时候再向“云”租借,这样以来连游戏的数据包都不用下载了,因为他们都在服务器上了,甚至我们可以直接在手机上玩以前只有在电脑上才能玩的游戏或应用程序(这样也可以很好地解决令软件开发商很头疼的盗版问题,因为在本地不存放数据)。而带宽问题也不需要过多考虑,因为我国现在三家运营商都在力推3G网络,最快的联通WCDMA带宽达到了10M以上,而未来的4G网络(在一些国家已经正式商用)带宽会更高。

而移动互联网可以说就是物联网的一个真子集,物联网所包含的范围更大,但是他和移动互联网有个相同的地方,就是终端的性能不会很强大——由于体积以及续航或是其他原因。

举个例子:三一重工和联通公司有一个项目,就是把三一的大型工程机械上面加装一个连着3G网的一个摄像头,当机器出故障的时候,实时图像可以通过3G网络传到维修人员那里,然后远程指挥维修(远程医疗类似,只不过是在把心电图等一些数据通过网络传到医生那里)。另外一个是前不久的国防科大和湖南联通研制的“智能校车”(http://www.chinaunicom.com.cn/city/hunan/xwgg/file60.html )还有移动现在在做的“移动城市”(实时路况查询、公交到站情况查询等)也是通过把一些传感器连上移动网络,把采集到的各种数据发送到“云”服务器,在经过处理,把需要查询的结果直接返回给客户机。

听一位学长说,他现在所在的团队的项目经理曾经在土豆网,当时他的Boss让他开发手机上的在线看视频的软件,但是他觉得这个没什么用——当时2G的网络速度这么慢,加上手机的性能普遍不高——觉得这是对他的不重视,所以跳槽走了,现在再回头想真是后悔莫及啊。

IT行业的发展速度快得惊人,这就要求我们有与时俱进的能力,我认为方向比努力更重要,我们要敢于“幻想”,勤于思考,多多了解最新的信息,找到我们努力的方向,只有明确了我们的目标和方向,我们的努力才更有意义!

虽然我现在的技术实力还很弱,写的程序还处于那种“高耦合低内聚”的阶段,但是我相信我努力的方向是没有错的!加油!

——谨以此文献给我自己以及和我一样将为IT事业而献身的童鞋们~

  • 大小: 46.1 KB
  • 大小: 75 KB
  • 大小: 14.1 KB
  • 大小: 110.9 KB
5
1
分享到:
评论
4 楼 jcs130 2012-02-01  
pengchenming 写道
写的很强大,受教了,弱弱的问句,大哥你也是在蓝杰学习?

是啊~刚学到通信部分……
smm11230704 写道
讲的挺好的,从小分析到大。

客户端和服务器端压力的计算,是个问题。

分布式计算和分布式存储还有算法优化可以解决很多问题。

富客户端和轻客户端的选型还是要看产品定位。

恩~还要继续努力啊~
3 楼 smm11230704 2012-01-19  
讲的挺好的,从小分析到大。

客户端和服务器端压力的计算,是个问题。

分布式计算和分布式存储还有算法优化可以解决很多问题。

富客户端和轻客户端的选型还是要看产品定位。
2 楼 pengchenming 2012-01-19  
写的很强大,受教了,弱弱的问句,大哥你也是在蓝杰学习?
1 楼 weiwei5910 2012-01-18  

相关推荐

Global site tag (gtag.js) - Google Analytics