用RED5作为服务器端,Flash作为客户端开发实时在线游戏已经有一段时间了。
下面我把一些在开发中的问题及解决说明一下,希望可以给大家带来帮助。
先大致说一下我们开发的逻辑,我们自己定义了一套MESSAGE,MESSAGE分为3类,
1、EVENT,处理事件。EVENT相当于一个注册表,比如说,所有用户列表更新的事件,用户进入时首先会向服务器注册一个事件用于获取所有用户的列表,当有新用户进入时,服务端会搜索注册了这一事件的用户,并向所有用户INVOKE相对应的方法,相当于广播。
2、REQUEST,处理用户请求。用户请求可能会有Response,可能会有Brocast,根据Request的类型来分别进行逻辑处理。
3、RESPONSE,请求处理完成之后的响应。有Response必然有Request,当用户发起了Request,服务端会统一的INVOKE客户端的一个方法,由该方法转发服务器处理之后的数据。
下面说一下一些问题
1、关于Scope
room就是一个Scope,链接Room,可以通过客户端发起的Connection的URL进行链接,这种情况下,服务端会判断是否已经存在这个Room,如果存在,则让用户直接链接,如果不存在,则服务器端会先创建这个Room,再让用户连接。
我们为了实现大厅和房间,在appStart时手动的去创建了这些Room,一开始用了scope.addChildScope()方法,结果在用户进入房间时一直报NullPointException。查了一下API,发现,addChild只能工作在子域中,修改为createChildScope(),问题解决。
用户连接到app直后,通过conn.connect(Scope scope)方法进入房间,但是此时发现了一个百思不得其解的问题,虽然没有给程序造成影响,但看着总是不爽 。当用户连接到Room之后,会进行appDisconect的操作,当用户断开客户端时,却只执行了roomDisconect方法,当用户断开链接时,我需要在appDisconect中作一些关于用户的操作。这个问题一直没解决,如果有同学知道是为啥,请解答,在这先谢过
2、从Flash客户端带参数回传
做过很多的测试,用JSON的形式最好,JSON回传的字符串,在服务端可以通过ObjectMap这个类去解开,很方便。
3、全局变量
一定要谨慎的使用全局变量,最好是通过Room来存储一些全局的数据,比如游戏的进度信息,用户信息。
4、Ghost
经常会出现一些客户端即使断开了还存在的情况,可以用killGhostConnections()这个方法。
5、ShareObject的利弊
当最后一个用户离开时,自己创建的ShareObject会被销毁,当客户端再链接时,会由客户端去创建这个SharedObject,服务端就无法监控这个SO的状态了,所以推荐用Call及Invoke的方式进行交互。
大概就这些,希望对大家有帮助