利用BlazeDS实现Java和ActionScript3通信(AsWing和remoting服务)

OK,在解决了一个本人百思不得其解的问题后,开始下一步工作,让我们开始使用BlazeDS。

本次任务目的,AsWing程序向服务器发送信息,服务器返回这个信息,并在AsWing界面上显示出来。

1.Aswing我就不多说了,以前说过一些,具体的可以到官网去看,况且这里也不是复杂运用。而且AsWing网站有专门的介绍BlazeDS通信的文章,我的程序也是从那里学来的。用AsWing画一个界面。

2.编写服务端Java代码。

<>

public class SayHello {

    import java.uti.Array;
    public Array getId(String[] arr) 

    {
        return arr;
    }

}

哈哈,很简单吧,意思就是,flash传给我们什么,我们就返回什么。ok,编译java文件成class文件,接下来我们只需要class文件了。

3.BlazeDS为我们提供了Tomcat应用框架的模板,我们只需要拷贝一份blazeds_turnkey_3-0-0-544\tomcat\webapps下的blazeds文件夹,把它命名为自己想要的应用的名字就可以了,但是我们粘帖的新的应用的文件夹同样要在webapps文件夹下,具体原因以前说过。

4.这里我们重命名的文件夹名字为“aswingtestshow”,记住这个名字,因为以后我们会用到。接下来把我们编译好的class文件放到aswingtestshow\WEB-INF\classes文件夹下。

5.重要的一布,我们开始编写配置文件了。上文提到,我们用的是remoting服务,那自然是到 blazeds_turnkey_3-0-0-544\tomcat\webapps\aswingtestshow\WEB-INF\flex文件夹下找到相应的配置文件remoting-config.xml,打开编辑它吧。以下是整个文件的内容:

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service"
    class="flex.messaging.services.RemotingService">

    <adapters>
        <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
    </adapters>

    <default-channels>
        <channel ref="my-amf"/>
    </default-channels>
<destination id="sayHello">
     <properties>
      <source>SayHello</source>
      </properties>
     </destination>


</service>

带下滑线的部分是我添加的,其余的是系统默认的,具体解释一下,destination标签代表了一个远程调用,对应Java文件的一个类,id属性代表的是AS调用时使用的标识,source标签意味着我们在class文件夹下的Java的类文件的类名,如果有包名,按Java的正常调用方式,添加上去。注意,这里我们还没有使用java类中的函数名。如果你没有多余的更改的话,我想现在服务器端的配置已经完成了。你可以利用浏览器查看一下, http://{server.name}:{server.port}/{context.root}/messagebroker/amf,server.name-你的机器ip或机器名,server.port-服务端口,context.root-网络应用名。

在我写这篇blog之前,我一直觉得上面的地址是一个很神奇的字符串,因为我不知道他是哪里来的,知道今天我发现了,他来自flex文件夹下的services-config.xml文件,

<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
           <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
       </channel-definition>

还记得remoting-config.xml文件中默认的一段描述吗?

<default-channels>
        <channel ref="my-amf"/>
    </default-channels>

看看两个channel的描述,ok,我想大家如果想更改的话知道如何更改了。

这个地址http://{server.name}:{server.port}/{context.root}/messagebroker/amf,转化成我现在的实际的地址应该是:http://localhost:8400/aswingtestshow/messagebroker/amf.

用浏览器查看这个网址,如果空吧,那证明你成功了,如果是页面未找到404,那很遗憾,可能我们在哪里出错了。

4.我们终于可以用flash来调用java了。

AS代码如下:

package {
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.net.NetConnection;
    import flash.net.ObjectEncoding;
    import flash.net.Responder;
    import org.aswing.AsWingManager;
    import org.aswing.BorderLayout;
    import org.aswing.JButton;
    import org.aswing.JFrame;
    import org.aswing.JTextArea;
    import org.aswing.JTextField;

    public class AswingTest extends Sprite
    {
        //用户输入框
        private var txt:JTextField = new JTextField();
        //程序主框架
        private var window:JFrame = new JFrame(this);
        //链接
        private var nc : NetConnection = new NetConnection(); 
        //要发送的数组
        private var arr:Array = new Array(); 
        //显示接受的数据
        private var txtA:JTextArea = new JTextArea();
        //回应
           private var responder : Responder = null;
        //服务连接字符串
           private const amf3URL : String = "http://127.0.0.1:8400/aswingtest/messagebroker/amf";

        public function AswingTest()
        {
            AsWingManager.initAsStandard(this);
            //配置主框架信息
            window.setSizeWH(400,300);
            window.setTitle("BlazeDS通信");
            //配置按钮信息
            var btn:JButton = new JButton("Hello")
            btn.addEventListener(MouseEvent.CLICK,btnClicked);
            //配置用户输入框信息
            txt.setMinimumWidth(100);
            //配置返回的信息显示框信息
            txtA.setMinimumHeight(200);
            txtA.setMinimumWidth(200);
            txtA.setWordWrap(true);
            //向容器中添加显示元素
            window.getContentPane().setLayout(new BorderLayout());
            window.getContentPane().append(btn,BorderLayout.SOUTH);
            window.getContentPane().append(txt,BorderLayout.NORTH);
            window.getContentPane().append(txtA,BorderLayout.CENTER);
            //显示到舞台
            window.show();
            //配置链接信息
            responder = new Responder(resulet,error);
            nc.objectEncoding = ObjectEncoding.AMF3; 
            nc.connect(amf3URL); 
        }
        /**
         * 点击按钮时向服务器发送数据
         *
        */
        private function btnClicked(e:MouseEvent):void {
              arr.push(txt.getText());
              nc.call("sayHello.getId", responder,arr);
            txt.setText("");
        }
        /**
         * 成功接受到返回的数据时的现实信息
         */
        private function resulet(e:Object):void {
            //取得返回数据并转换为Array对像
            var getarr:Array = e as Array;
            var showstr:String = "";
            //格式化为String
            for(var i:int = 0; i < getarr.length; i++) {
                showstr += getarr[i] + "\n";
            }
            //在文本框中显示
            txtA.setText(showstr);
        }
        /**
         * 调用服务出错时的处理函数
         */
        private function error(e:Object):void {
            txt.setText(e.toString());
        }
    }
}

值得解释的private var nc : NetConnection = new NetConnection();  定义一个远程服务对象,作用是,联系远程java类,并执行某些操作。

  nc.objectEncoding = ObjectEncoding.AMF3;  
  nc.connect(amf3URL);
  设置远程连接数据传输类型,并设置远程连接字符串,private const amf3URL : String = "http://127.0.0.1:8400/aswingtestshow/messagebroker/amf";还记得这个字符串吧?在哪个什么配置文件里来的。

然后我们最期望的事情发生了

nc.call("sayHello.getId", responder,arr);

“sayHello”记得配置文件里那个id吗?
<destination id="sayHello">
     <properties>
              <source>SayHello</source>
      </properties>
</destination>
注意,是id中的首字母小写的id。
那是getId又是什么呢?是java的SayHello这个类中的那个函数,
public Array getId(String[] arr) 

    {
        return arr;
    }

responder呢,是一个回调类,也就是我们调用远程的getId这个方法,并且远程方法返回信息给我们的时候,我们会调用到 responder。它的基本构成是两个函数,一个是成功返回要调用的函数,一个是失败返回要调用的函数,在这里分别是,responder = new Responder(resulet,error);

我们可能都希望调用成功吧,那我们看看调用成功后是怎么处理的,

         /**
         * 成功接受到返回的数据时的现实信息
         */
        private function resulet(e:Object):void {
            //取得返回数据并转换为Array对像
            var getarr:Array = e as Array;
            var showstr:String = "";
            //格式化为String
            for(var i:int = 0; i < getarr.length; i++) {
                showstr += getarr[i] + "\n";
            }
            //在文本框中显示
            txtA.setText(showstr);
        }

java返回给了我们的是Array类型的数据,as中和Array类型对应。但是我们需要转化,至于更多类型的对应关系,大家可以上网查。
我们只需要一句话把我们想要的数组获得

var getarr:Array = e as Array;

接下来去用我们的数据就好了。

你可能感兴趣的:(java,tomcat,应用服务器,Flex,Flash)