发新话题
打印

Blue框架1.0版(开发flash网络应用程序)

本帖已经被作者加入个人空间

Blue框架1.0版(开发flash网络应用程序)

如蒙转载,请注明文章出处:www.sujun.org   作者:弃天笑

Blue框架1.0版发布了!!!!

简介:
    Blue框架是一款开源的Flash RIA应用技术,该框架完全由本人所开发。此框架的开发主要是受到Flash Media Server的启示,同时也模仿了其中的部分功能。其拥有优秀的异常处理,性能稳定。使用Blue ,可以使flash程序和java程序员完全独立开来,各自开发程序。该框架最新版本是1.0。
Blue框架拥有完整全面的服务端类的API,详细的使用教程,同时还附带了一些简单实用的例子,一个完整的Flash聊天室。

Blue部分包介绍

服务端核心包:
org.blue.net包:网络包,用于建立TCP通讯和网络线程的管理
org.blue.response包:响应客户端数据的包,里面有各种处理类
org.blue.xml包:生成xml各种数据和解析xml数据
org.blue.remote包:该包封装了各种远程数据
org.blue.exception包:各种异常类
客户端核心包:
org.blue.net包:网络包,用于建立TCP通讯和网络线程的管理。
org.blue.xml包:生成xml各种数据和解析xml数据。
org.blue.remote包:该包封装了各种远程数据
org.blue.exception包:各种异常类
mx.soda.util包:该包封装了java对象和仿java对象功能


该软件已实现的功能:
1.支持远程方法调用(类似FMS的远程方法调用),flash(客户端)和java(服务端)可以直接调用对方已经声明的方法
2.支持在java和flash之间直接传输各种数据类型,目前有:Number(int),String(String),Boolean(boolean),数组(int[],String[],Object),Object(FlashObject),Map(Map).
注:括号里的为java相对应的数据类型

缺点:
1.数据传输格式采用xml方式传输,传输效率不高,有垃圾数据
2.服务器配置没有采用外部文件配置,不灵活
3.……

虽然有这许多缺点,但还是不妨碍我们学习和使用。目前有我开发的flash聊天室作为例子,同时还还有其他的使用例子。虽然没有什么商业用途,但是还有学习用途的。无论是java的反射技术还是flash里的动态调用方法等等
注:Blue你可以任意复制和修改,但保留作者的版权。

blue框架资源下载列表:
blue服务端的jar文件   blue01.jar;
blue服务端的java文件  BlueForJava_src_01.rar
blue客户端的flash文件   客户端类包
Blue框架的使用例子  example
基于blue框架的flash聊天室    Flash聊天室
基于Blue框架开发的简单网游(实现了一些基础的功能):基于Blue框架开发的简单网游

首先声明,这是我一年前写东东,代码什么的都算是比较差劲的了。没有什么商业用途,顶多是学习学习。
在服务器方面,用到了java的反射,这也是我非常喜欢的地方。客户端也用到了类似的反射。

本来就是不打算放出来的,但是现在自己已经经常用AS3.0了,这个东西放着闲着也是闲着,所以就放出来,也许会有人感兴趣。

暂时是不会对该版本进行更新了,除非有人去用。不然就专心开发下个版本了(主要是基于as3.0)

TOP

Blue框架的基本教程一:连接服务器方法

如蒙转载,请注明文章出处:www.sujun.org   作者:弃天笑

下载Blue框架的服务端和客户端的包,接着我们就看其中的使用例子
(下载类库:类库)

在使用Blue之前,建议先去看看服务端和客户端的api
服务器的主要看Server,Application,StartEndListenter,Client
客户端看一个ConnectJavaServer类的文档就够了
当然,你直接看例子也很容易熟悉的

首先来看flash客户端怎么连接到服务器上去的
先看客户端的as代码

//导入ConnectJavaServer类
import org.sujun.blue.net.ConnectJavaServer;
//实例化一个网络连接类
var netConnect:ConnectJavaServer = ConnectJavaServer.getConnectJavaServer();
//客户端连接成功或者失败后,会调用该事件
netConnect.onConnect = function(msg:String)
{
    trace("msg:" + msg);
    if(msg == "connect success")
    {
        trace("连接成功");
    }
    else
    {
        trace("连接失败");
    }
}

//连接服务器
netConnect.connect("localhost",5588,"soda","admin123");

代码就很简单啦,说得很明白,当然,首先是要把那个客户端的包放进去

接下来看服务端的代码的MainFrame.java类
首先是一个启动服务器的,这个类调用了blue的里网络服务
import org.sujun.blue.net.Server;
import org.sujun.blue.global.Application;

public class MainFrame
{
    public static void main(String[] args)
    {
        //注册响应客户端连接和端开处理类
        Application.addStartEndListenter(new StartAndEnd());
        Server ser = new Server();
        //设置端口
        ser.setPort(5588);
        //启动服务
        ser.startServer();
    }
}

这个类很简单,注意到代码中的这一行,
//注册响应客户端连接和端开处理类
Application.addStartEndListenter(new StartAndEnd());
查看blue提供的相应api就知道了,Application.addStartEndListenter这个方法是注册一个相应客户端连接与关闭的方法,需要的参数是StartEndListenter接口的实现类
StartEndListenter接口只定义了两个默认的方法
/**
     * 客户端刚连接成功时调用该方法
     * (默认带一个参数方法)
     * @param client 包含客户端信息的Client实例
     */
    public void onConnet(Client client)
    {
    }
   
    /**
     * 客户端意外与服务器断开连接时响应该方法
     * (默认带一个参数方法)
     * @param client
     */
    public void thunderboltCut(Client client)
    {
    }

这两个默认的方法,blue框架都已经默认地实现了,但是如果需要在客户端登陆或者退出的时候传递参数的时候,就需要对这两个方法进行多态了。下面是我们例子的响应客户端连接端开的代码
StartAndEnd.java
import org.sujun.blue.remote.Client;
import org.sujun.blue.global.Application;
import org.sujun.blue.response.StartEndListenterAdapter;


public class StartAndEnd extends StartEndListenterAdapter
{
    //客户端连接时调用,提供了3个参数,注意Client client这个参数是必须的
    public void onConnet(Client client,String name, String pass)
    {
        //判断用户名是正确
        if(name.equals("soda") && pass.equals("admin123"))
        {
            //成功连接
            Application.setStart(true,"SUCCESS");
        }
        else
        {
            //连接失败
            Application.setStart(false,"FAIL");
        }
        System.out.println("用户连接程序完毕");
    }
   
    //客户端端开时调用
    public void thunderboltCut(Client client)
    {
        System.out.println("服务器意外关闭时调用!没有参数的");
    }
}

源代码下载:例子代码

[ 本帖最后由 弃天笑 于 2007-10-14 01:46 编辑 ]

TOP

Blue框架的基本教程三:服务端调用客户端的方法

如蒙转载,请注明文章出处:www.sujun.org   作者:弃天笑

接下来是服务器呼叫客户端的方法,这里也只是简单的作个例子,具体的可以看源代码
下面是服务器呼叫客户端的代码StartAndEnd.java
这里是响应客户端连接的方法类,为了方便起见,我把服务器调用客户端的代码写在客户端连接成功后呼叫
,详细的看callClient(Client client)方法

import java.util.Map;
import java.util.HashMap;

import org.sujun.blue.remote.Client;
import org.sujun.blue.remote.FlashObject;
import org.sujun.blue.global.Application;
import org.sujun.blue.response.StartEndListenterAdapter;


public class StartAndEnd extends StartEndListenterAdapter
{
    public void onConnet(Client client,String name, String pass)
    {
        if(name.equals("soda") && pass.equals("admin123"))
        {
            Application.setStart(true,"SUCCESS");
            callClient(client);
        }
        else
        {
            Application.setStart(false,"FAIL");
        }
        System.out.println("用户连接程序完毕");
        
    }
   
    private void callClient(Client client)
    {
        System.out.println("开始呼叫客户端的方法");
        //在这里呼叫客户端的一个对象的方法
        FlashObject flash = new FlashObject();
        
        //传送object过去
        flash.put("info", "该用户登陆成功");
        flash.put("msg", "测试数据");
        flash.put("num", 15);
        //传字符串数组过去
        String[] strs = new String[3];
        strs[0] = "my";
        strs[1] = "name";
        strs[2] = "soda";
        
        //传数字数组过去
        double[] number = new double[3];
        number[0] = 11;
        number[1] = 15;
        number[2] = 21;
        
        //传map过去
        Map map = new HashMap();
        Map map1 = new HashMap();
        map1.put("name", "soda");
        map1.put("age", "24");
        Map map2 = new HashMap();
        map2.put("address", "广州");
        map2.put("main", "sujun10@21cn.com");
        map.put("map1", map1);
        map.put("map2", map2);

        //呼叫客户端的默认方法
        //client.call("clientMethod");
        //呼叫客户端指定对象的一个方法
        client.call("client","clientMethod");
        client.setParam("soda");
        client.setParam(23);
        client.setParam(flash);
        //client.setParam(strs);
        client.setParam(number);
        client.setParam(map);
        client.send();
    }
    public void thunderboltCut(Client client)
    {
        System.out.println("服务器意外关闭时调用!没有参数的");
    }
}
在callClient(Client client)方法了,主要是传送了Object,String,double,double[],Map等基本数据类型,同时在flash也是可以把这些数据类型传过来的。各为读者可以自己去验证一下

//呼叫客户端的默认方法
        //client.call("clientMethod");
        //呼叫客户端指定对象的一个方法
        client.call("client","clientMethod");
        client.setParam("soda");
        client.setParam(23);
        client.setParam(flash);
        //client.setParam(strs);
        client.setParam(number);
        client.setParam(map);
        client.send();
这里是发送参数的代码
client.call("client","clientMethod");这里指定了服务端的对象以及方法
client.setParam();方法是发送一个参数,顺序和参数类型必须和客户端方法一直
参数传完后,必须调用client.send();方法,才算完成远程调用

细心人会发现这个代码,//client.call("clientMethod");
恩,如果没有指定客户端的对象,默认是调用客户端连接类的方法的,即是ConnectJavaServer.as这个类的实例

////////////////////////////////下面是客户端的主代码///////////////////////
//支持自定义对象的方法被服务器调用
var clientObj:Object = new Object();
//注册到网络连接类里去
netConnect.addServerCall("client",clientObj);
clientObj.clientMethod = function(name:String,age:Number,obj:Object,arry:Array,map:Map)
{
    trace("自定义对象");
    trace("name:" + name);
    trace("age:" + age);
    trace("arry:" + arry);
    trace("obj[info]:" + obj["info"]);
    trace("obj[msg]:" + obj["msg"]);
    trace("obj[num]:" + obj["num"]);
    trace("map:" + map);
    var map2:Map = map.get("map2");
    trace("map2:" + map2);
    trace("map2.get(address):" + map2.get("address"));
    trace("map2.get(main):" + map2.get("main"));
}
运行输出结果是:
自定义对象
name:soda
age:23
arry:11,15,21
obj[info]:该用户登陆成功
obj[msg]:测试数据
obj[num]:15
map:[object Object]
map2:[object Object]
map2.get(address):广州
map2.get(main):sujun10@21cn.com
连接成功
num:100


源代码下载:代码

[ 本帖最后由 弃天笑 于 2007-10-14 01:48 编辑 ]

TOP

Blue框架的基本教程二:客户端调用服务器的方法

如蒙转载,请注明文章出处:www.sujun.org   作者:弃天笑

上篇说到客户端连接和端开连接,服务器有什么事件,那么我们先做就来看看客户端调用服务器上的方法
客户端连接服务器的代码这里就不在重复了,只说调用服务器的代码
定义个接受服务器返回结果的响应事件对象
var receice:Object = new Object();
//服务器返回结果时调用该方法
receice.onResult = function(num:Number)
{
    trace("num:" + num);
}
//远程调用方法失败时响应该方法
receice.onFault = function(msg:String)
{
    trace("fail:" + msg);
}

//呼叫服务器的方法
function callServerMethod()
{
    //对象
    var obj:Object = new Object();
    obj.name = "objName";
    obj.num = 50;
    //数组
    var ary:Array = [1,4,7,16,98,100];
        //把参数发送到服务器上去,第一个为服务器上的一个类实例的标示
        //第二参数是要调用的方法名,第三个是要接受服务器返回结果的对象
        //往后就是要传到服务器的参数了,注意,参数类型顺序一定要和服务器方法的参数一致
    netConnect.call("services","callParams",receice,"中文",23);
}

//注意,记得在连接服务器成功后。再调用这个callServerMethod()函数就可以了

接着再来看服务端的代码,首先是要被客户端调用的对象
ReceiveClientCall.java
public class ReceiveClientCall
{
    public double callParams(String name, double age)
    {
        System.out.println("客户端传过来的name:" + name);
        System.out.println("客户端传过来的age:" + age);

        
        return 100;
    }
}

很简单,就定义了一个callParams方法以及两个参数,对应客户端的
netConnect.call("services","callParams",receice,"中文",23);
接着就可以看控制台是否打印出客户端传过去的数据。

就这样写一个类就可以被客户端调用了吗?答案是不行的,我们还必须做一些事,那就是告诉服务器,有这么一个对象可以被客户端调用
那么看回MainFrame.java这个类的代码
比较一下之前,就可以发现多了一行代码

import org.sujun.blue.net.Server;
import org.sujun.blue.global.Application;

public class MainFrame
{
    public static void main(String[] args)
    {
        //注册响应客户端连接和端开处理类
        Application.addStartEndListenter(new StartAndEnd());
               //注册被客户端调用的对象
        Application.regeditClass("services", ReceiveClientCall.class);
        Server ser = new Server();
        //设置端口
        ser.setPort(5588);
        //启动服务
        ser.startServer();
    }
}

仔细一看,就是多了这行代码
//注册被客户端调用的对象
Application.regeditClass("services", ReceiveClientCall.class);
第一个参数是被该对象命个名,即是被客户端调用的称号,第二个就是一个Class对象啦

恩,做完这些步骤,就可以去运行服务器看效果啦
(其实我们还可以传对象,数组等等的)

源代码下载:  [url=http://www.sujun.org/downfiles/blue/example.rar[/url]例子代码

[ 本帖最后由 弃天笑 于 2007-10-14 01:49 编辑 ]

TOP

发新话题