Sun公司开源游戏服务器Project Darkstar Server(SGS)-----AS3客户端技术详解(一)

一、Connecting连接

sgs客户端第一件要做的事情就是与服务器建立连接。 连接的步骤有以下:

1、 创建一个SimpleClient实例

你需要做的第一件事情就是实例化一个SimpleClient.SimpleClient 的构造器需要一个参数:一个 SimpleClientListener ,用于调用通信的事件。在一般基础的客户端程序中,这就相当于一个主类,它的代码的大体看起来如下所示:

public class Client extends EventDispatcher implements SimpleClientListener
    {
        //....

        client=new  SimpleClient(this);

    }

2、Create the login properties.创建一个登陆的属性。

SimpleClient 登陆的方法需要一个参数即可,一个( 属性 ) 对象。在AS3中这个对象由Object构造,这个 SimpleClient的实例设置了两个属性:主机和端口。下面的例子演示了如何设置这些属性: 

var connectProps:Object=new Object();
connectProps[ClientConnector.HOST]
=host;
connectProps[ClientConnector.PORT]
=port;

3、Call the login method.调用登陆方法

this.client.login(connectProps);

4、发送验证消息

为了响应你的登陆请求, API 将调用用 getPasswordAuthentication ( 获取密码验证 ) 来响应你的SimpleClientListener ( 简单客户端的监听器 ) 的用户名和密码的登陆请求。 “ Password ” 在这里是一种常见的验证信息的形式,该验证服务返回给 API( 即客户端 API) 一个二进制的数组 。

得到什么信息,和你服务器安装的验证程序有关。默认的验证信息是返回密码的完整信息,允许任何人登陆。 PDS 环境也通过验证服务器返回一个 hash 字符串。可以复写其他的验 证者来支持用户特定的验证服务。 

代码
private var _user:PasswordAuthentication;
public function get passwordAuthentication():PasswordAuthentication
        {
            
return this._user;
        }
        
        
public function set passwordAuthentication(pauth:PasswordAuthentication):void
        {
            
this._user=pauth;
        }

在上面这些步骤中, API 会登陆到服务器。如果登陆成功,将会由 SimpleClientListener 返回返回登陆信息。 SimpleClientListener负责登录的事件处理

代码
public function loggedIn():void
        {
            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));
            
        }
        

 完整的代码详见:

Sun公司开源游戏服务器Project Darkstar Server(SGS)-----AS3客户端


posted @ 2009-12-05 17:05  木瓜网络  阅读(3500)  评论(0编辑  收藏  举报