Sun公司开源游戏服务器Project Darkstar Server(SGS)-----AS3客户端技术详解(一)
一、Connecting连接
sgs客户端第一件要做的事情就是与服务器建立连接。 连接的步骤有以下:
1、 创建一个SimpleClient实例
你需要做的第一件事情就是实例化一个SimpleClient.SimpleClient 的构造器需要一个参数:一个 SimpleClientListener ,用于调用通信的事件。在一般基础的客户端程序中,这就相当于一个主类,它的代码的大体看起来如下所示:
{
//....
client=new SimpleClient(this);
}
2、Create the login properties.创建一个登陆的属性。
SimpleClient 登陆的方法需要一个参数即可,一个( 属性 ) 对象。在AS3中这个对象由Object构造,这个 SimpleClient的实例设置了两个属性:主机和端口。下面的例子演示了如何设置这些属性:
connectProps[ClientConnector.HOST]=host;
connectProps[ClientConnector.PORT]=port;
3、Call the login method.调用登陆方法
4、发送验证消息
为了响应你的登陆请求, API 将调用用 getPasswordAuthentication ( 获取密码验证 ) 来响应你的SimpleClientListener ( 简单客户端的监听器 ) 的用户名和密码的登陆请求。 “ Password ” 在这里是一种常见的验证信息的形式,该验证服务返回给 API( 即客户端 API) 一个二进制的数组 。
得到什么信息,和你服务器安装的验证程序有关。默认的验证信息是返回密码的完整信息,允许任何人登陆。 PDS 环境也通过验证服务器返回一个 hash 字符串。可以复写其他的验 证者来支持用户特定的验证服务。
public function get passwordAuthentication():PasswordAuthentication
{
return this._user;
}
public function set passwordAuthentication(pauth:PasswordAuthentication):void
{
this._user=pauth;
}
在上面这些步骤中, API 会登陆到服务器。如果登陆成功,将会由 SimpleClientListener 返回返回登陆信息。 SimpleClientListener负责登录的事件处理
{
trace("客户端登录成功");
dispatchEvent(new SGSEvent(SGSEvent.LOGIN_SUCCESS));
}
public function loginFailed(reason:String):void
{
trace("客户端登录失败");
dispatchEvent(new SGSEvent(SGSEvent.LOGIN_FAILED));
}
public function exceptionThrown(err:String):void
{
trace("连接出错了");
dispatchEvent(new ExecptionEvent(err));
}
public function joinedChannel(channel:ClientChannel):ClientChannelListener
{
return null;
}
//接收客户端的数据
public function receivedClientMessage(message:BeyondoByteArray):void
{
var str:String=message.readSgsString();
dispatchEvent(new TestMessageEvent(TestMessageEvent.MESSAGEEVENT,str));
}
//从新连接
public function reconnecting():void
{
}
public function reconnected():void
{
}
public function disconnected(graceful:Boolean, reason:String):void
{
trace("断开连接");
dispatchEvent(new SGSEvent(SGSEvent.DISCONNECTED));
}
到此,客户端就连接上了服务器,可以开始和服务器进行通信了。若登 陆失败,登陆失败将会把登陆失败的原因返回,来替代传递一个登陆的字符串信息。
二、Client/Server Communicatio客户端 / 服务器的通信
一旦我们和服务器建立了连接,我们就可以和服务器进行通信了。在 sgs环境中有两种通信形式:客户端 / 服务器通信模式和订阅 / 发布通道的通信模式。我们的第一个例子使用客户端 / 服务器模式,该模式是这两者之中最简单的。
在 PDS 环境中所有的通信都是通过发送和接收标准的二进制格式来完成的。对于 Java 程 序员来说将会看到一些较早形式的通信方式。然而, PDS 环境是一个客户端透明的系统。 PD S的目标是将 J2SE,J2ME, 和 C/C++ 等客户端的 API 接口统一起来。其他平台也可以和 PDS 进行通信,这些会作为后面的开发目标。
当一些通用语言对象在系统存在时,他们不属于特定的平台,或者是比较复杂,带一些多 余的功能。对于 PDS 的开发团队来说,最好的解决办法就是提供一个通用的、高效的基于发送和接收二进制数据的形式来解决该问题,让特定的应用建立在此基础之上,按他们自己 的需要。 向服务器发送一个数据包,我们所要做的就是将数据包以二进制的形式传递到 SimpleClient对象发送的方法中。
public function send(message:String):void
{
var buf:BeyondoByteArray=new BeyondoByteArray();
buf.writeUTF(message);
this._client.send(buf);
}
当服务器发送一个数据包返回给客户端时,它是通过 SimpleClientListener 监听器将接收的信息返回的。
public function receivedClientMessage(message:BeyondoByteArray):void
{
var str:String=message.readSgsString();
dispatchEvent(new TestMessageEvent(TestMessageEvent.MESSAGEEVENT,str));
}
完整的代码详见: