Silverlight MMORG WebGame游戏设计(二) 通讯协议之惑2013-11-15 博客园 wangergo晚上看到我在silverlight webGame上的导师"深蓝色右手"拿到

荣誉,觉得他名至实归。回想自己2010过年来到北京忙于一些琐屑的事情,好久没有动手写我的 web传奇了。去年在群里说我过年要开源我的Web传奇,写一些服务端的文章。后来我发现自己在服务端开发上经验还欠 缺,还没有一个成熟的框架,自己也在摸索中,我也打算今年向公司用C++写服务端的同事学下。在2009年10月份,我就打算写服务端,可我两眼一抹黑,用什么语言写,用什么通讯方式?作为一个6年来 一直用C#的人来说,用C#进行开发是个风险比较小的方案。那么通讯方式呢?siverlight里客户端和服务端通讯有 WCF,RIA Services,Socket,Http。选那一个好呢? 我们看以下的场景.

这是令人热血沸腾的传奇3攻城画面,我在上一篇文章所写的攻城战就是这个场面,左下角的旗台也就是当 年我誓死捍卫的阵地,想当年我“一夫当关,万夫莫开”,哎,不提当年了。我们数数这个画面的人物:50个人物,三种职业。有战士在释放“莲月剑法”,有法师在释放“爆裂火焰” ,有道士在释放“复活术”。假如你是一个战士,正在用炼狱砍人。那么这个屏幕上的50个人都应该能看到你 在砍人,当然说看到时通俗的说法,用专业术语来说是50个客户端同时收到了你砍人的动作数据。这是典型的 服务端向客户端推送数据的过程。这一个过程持续时间很短,砍一下人不过1秒左右,为了做到及时性,50个 客户端应当在100毫秒以内接收到数据才能保证游戏流畅度.这样以来,http通讯方式就被排除了,因为http方式服务端是没办法主动发送数据到客户端的,就如同你 在浏览器里看网页一样,你请求什么页面,才会得什么内容。打个比方,如果你用http方式来玩游戏的话,你 就得不停得刷新浏览器。当然你可能知道页面也能定时自动刷新的,那么这个定时器可是1秒要刷新 100次以 上。如果50个人都站着不动,那么就算没有数据要发送,服务端却要承受着:50*100=5000次请求/秒。所以我 们需要的是服务端能即时得在需要的时候发数据主动发送到客户端。那么 WCF,RIA Services呢,在很多siverlight程序里都选用了WCF,RIA Services来传递数据,特别是管 理系统,siverlight站点.但是做一个webGame是否可行?WCF是什么?简单介绍下:WCF整合了Remoting和webService等等。而且开发简单(相对的),它既弥补 Remoting的只能在.net上运行的缺点,又弥补了asmx只能单向传送消息的缺点。也就是说,WCF是实现跨平台 ,在跨平台的同时,也可以双向通信.看来WCF通讯是可行的,但是WCF双工通讯(Duplex channel)又分为基于Http方式和TCP方式的。Http本质 上是两对 Request/Response来模拟的,不算真正意义的Duplex channel,效率自然也不高。基于TCP方式的 WCF通讯效率较高,也符合OO思想,但是为了追求更高的效率最好也不用它。因为WCF是比较高层的封装,对比 更接近底层的Socket通讯,效率不够高。RIA Services本来就没有一个成熟的正式版本,后来微软也放弃更新了,把它和WCF整合了下,叫WCF RIA Services。口舌了这么多,其实我想要给大家介绍的重量级人物都等得不耐烦了,让我们请出它来吧:Socket,对, 就是它,最早出现在UNIX系统上。后来出现在window系统上也叫做winsocket.这位兄弟在游戏界可是大名鼎鼎 ,什么“魔兽世界”,“传奇”都得用它。如何把单机版的SL游戏,变成网络版的?①.我们需要写一个服务端,和SL客户端之间用Socket通讯引用命名空间:
using System.Net.Sockets;
using System.Net;
我们要新建两个项目:一个服务端使用的SocketServer项目,一个SL客户端使用的SocketClient.

需要注意的是SocketClient是

Silverlight类库项目,否则SL客户端无法引用。