转自:http://blessht.iteye.com/blog/1132934
Flex与Java通信的方式有很多种,比较常用的有以下方式:

WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用

HttpService:通过http请求的形式访问服务器

RmoteObject:通过AMF协议,以二进制的形式交互数据

Socket:套接字协议,服务器和客户端以IO的形式交互数据

上面几种各有个的优势:WebService常用于跨语言调用,不过解析协议需要花不少时间,运行速度不快;HttpService类似于Ajax;通常RmoteObject是最受欢迎的,因为它的运行效率快,数据解析方便。Socket编码稍微麻烦点,这里有一个Socket通信的例子,大家可以学习一下:http://blog.csdn.net/as_leon/article/details/5351713

今天针对WebService、HttpService和RmoteObject三种通信分别做一个例子,供大家学习参考。

在Flex页面上新建三个文本框和按钮,在文本框中输入内容再点击不同按钮调用不同通信方式,最后将Java返回的数据显示在界面上。首先看下运行效果:

  • WebService通信

【Java端代码】

JDK提供了比较全面的webservice支持,为了简化开发步骤,我使用了Apache CXF框架实现WebService的开发部署。CXF的使用可以参照这里:http://blessht.iteye.com/blog/1105562

首先创建一个接口:

  1. package webservice;
  2. import javax.jws.WebService;
  3. @WebService
  4. public interface HelloWebservice {
  5. public String getWebservice(String name);
  6. }

然后创建该接口的实现类:

  1. package webservice;
  2. import javax.jws.WebService;
  3. @WebService(endpointInterface="webservice.HelloWebservice",serviceName="hellows",portName="hellowsport")
  4. public class HelloWebserviceImpl implements HelloWebservice{
  5. public String getWebservice(String name) {
  6. return "你好["+name+"]这是来自webservice的信息..."+this;
  7. }
  8. }

最后创建服务器端启动代码,只要运行main方法即可。当前WebService没有部署在tomcat之类的服务器下,而是通过jetty部署的:

  1. package webservice;
  2. import javax.xml.ws.Endpoint;
  3. public class WebserviceServer {
  4. protected WebserviceServer() throws Exception {
  5. // START SNIPPET: publish
  6. System.out.println("Server Starting...");
  7. HelloWebservice hello = new HelloWebserviceImpl();
  8. String address = "http://localhost:8888/hellows";
  9. Endpoint.publish(address, hello);
  10. // END SNIPPET: publish
  11. }
  12. public static void main(String[] args) throws Exception {
  13. //启动web服务
  14. new WebserviceServer();
  15. System.out.println("Server ready...");
  16. Thread.sleep( *  * );
  17. System.out.println("Server exiting...");
  18. System.exit();
  19. }
  20. }

为了验证WebService是否启动成功,可以在浏览器下放入如下地址:http://localhost:8888/hellows?wsdl,如果部署成功,则浏览器会显示wsdl的xml配置信息。

【Flex端代码】

  1. <fx:Script>
  2. <![CDATA[
  3. //WebService调用
  4. protected function button3_clickHandler(event:MouseEvent):void
  5. {
  6. var ws:WebService = new WebService();
  7. ws.wsdl = "http://localhost:8888/hellows?wsdl";
  8. ws.loadWSDL();
  9. ws.getWebservice(webservice_txt.text);
  10. ws.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{
  11. webservice_result.text = e.result.toString()
  12. });
  13. }
  14. ]]>
  15. </fx:Script>
  16. <s:Label x="61" y="215" text="WebService:"/>
  17. <s:TextInput x="152" y="205" id="webservice_txt"/>
  18. <s:Button x="289" y="206" label="发送" click="button3_clickHandler(event)"/>
  19. <s:Label x="383" y="215" id="webservice_result"/>

注意,WebService,HttpService和RemoteObject发送请求都是异步的,开发人员需要编写回调函数来获取返回数据。

最后运行flex,在文本框中输入内容,点击发送按钮就能看到java服务端返回的数据。

  • HttpService通信

【java代码】

首先创建一个servlet,这里获取key值为"name"的数据(所以Flex端需要发送一个key为"name"的参数),最后通过PrintWriter.write的形式将结果返回给客户端。这是一个典型的Ajax请求响应例子。

  1. public class HelloHttp extends HttpServlet {
  2. private static final long serialVersionUID = 1L;
  3. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. this.doPost(request, response);
  5. }
  6. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  7. String name = request.getParameter("name");
  8. response.setCharacterEncoding("UTF-8");
  9. PrintWriter pw = response.getWriter();
  10. pw.write("你好["+name+"]这是来自Httpservice的消息...当前Session是:"+request.getSession());
  11. pw.close();
  12. }
  13. }


 编写完成后,将java项目部署到服务器中(我使用的是tomcat)。

【Flex代码】

Flex端需要创建一个HttpService对象来访问刚才的Servlet:

  1. <SPAN style="WHITE-SPACE: pre"> </SPAN><fx:Script>
  2. <![CDATA[
  3. //HttpService的形式访问Java服务器
  4. protected function button2_clickHandler(event:MouseEvent):void
  5. {
  6. var http:HTTPService = new HTTPService();
  7. http.url = "http://localhost:8080/JavaToFlex/HelloHttp?name="+http_txt.text;
  8. http.send();
  9. http.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{
  10. http_result.text = e.result.toString();
  11. });
  12. }
  13. ]]>
  14. </fx:Script>
  15. <SPAN style="WHITE-SPACE: pre"> </SPAN><s:Label x="61" y="138" text="HttpService:"/>
  16. <s:TextInput x="152" y="128" id="http_txt"/>
  17. <s:Button x="289" y="129" label="发送" click="button2_clickHandler(event)"/>
  18. <s:Label x="383" y="138" id="http_result"/>


 

  • RemoteObject通信

为了实现Flex调用Java代码,需要引入一个新的插件Blaseds。

把Blaseds项目WEB-INf下的flex文件夹拷贝到Java项目WEB-INF目录下,再将Blaseds项目下lib目录的jar文件引入到java项目中(注意jar文件冲突)。

随后编写一个Java类:

  1. package blaseds;
  2. import flex.messaging.FlexContext;
  3. public class RemoteClass {
  4. public String helloRemote(String name){
  5. return "你好["+name+"]这是来自JavaRemote的消息...当前Session是:"+FlexContext.getHttpRequest().getSession();
  6. }
  7. }

随后在web.xml中添加如下内容(这些配置在Blaseds文件的web.xml中都能找到):

  1. <!-- Http Flex Session attribute and binding listener support -->
  2. <listener>
  3. <listener-class>flex.messaging.HttpFlexSession</listener-class>
  4. </listener>
  5. <!-- MessageBroker Servlet -->
  6. <servlet>
  7. <display-name>MessageBrokerServlet</display-name>
  8. <servlet-name>MessageBrokerServlet</servlet-name>
  9. <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
  10. <init-param>
  11. <param-name>services.configuration.file</param-name>
  12. <param-value>/WEB-INF/flex/services-config.xml</param-value>
  13. </init-param>
  14. <load-on-startup>1</load-on-startup>
  15. </servlet>
  16. <servlet>
  17. <display-name>RDSDispatchServlet</display-name>
  18. <servlet-name>RDSDispatchServlet</servlet-name>
  19. <servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>
  20. <init-param>
  21. <param-name>useAppserverSecurity</param-name>
  22. <param-value>false</param-value>
  23. </init-param>
  24. <load-on-startup>10</load-on-startup>
  25. </servlet>
  26. <servlet-mapping id="RDS_DISPATCH_MAPPING">
  27. <servlet-name>RDSDispatchServlet</servlet-name>
  28. <url-pattern>/CFIDE/main/ide.cfm</url-pattern>
  29. </servlet-mapping>
  30. <servlet-mapping>
  31. <servlet-name>MessageBrokerServlet</servlet-name>
  32. <url-pattern>/messagebroker/*</url-pattern>
  33. </servlet-mapping>

最后打开Java项目,打开/WEB-INF/flex/remoting-config.xml文件,在文件中添加RemoteClass的远程支持:

  1. <service id="remoting-service" class="flex.messaging.services.RemotingService">
  2. <adapters>
  3. <adapter-definition id="java-object"
  4. class="flex.messaging.services.remoting.adapters.JavaAdapter"
  5. default="true" />
  6. </adapters>
  7. <default-channels>
  8. <channel ref="my-amf" />
  9. </default-channels>
  10. <!-- 定义远程调用的目标名 -->
  11. <destination id="remoteClass">
  12. <properties>
  13. <source>blaseds.RemoteClass</source>
  14. </properties>
  15. </destination>
  16. </service>

随后将Java项目部署到服务器中。

【Flex端代码】

Flex端为了调用Java代码,需要创建一个RemoteObject实例,属性destination就是在Java端remoting-config.xml文件中定义的<destination id="remoteClass">,这样你可以把RemoteObject当作一个RemoteClass的实例使用。

    1. <fx:Script>
    2. <![CDATA[
    3. //RemoteObject远程调用Java方法
    4. protected function button1_clickHandler(event:MouseEvent):void
    5. {
    6. var remote:RemoteObject = new RemoteObject();
    7. remote.destination = "remoteClass";
    8. remote.helloRemote(remote_txt.text);
    9. remote.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{
    10. remote_result.text = e.result.toString();
    11. });
    12. }
    13. ]]>
    14. </fx:Script>
    15. <s:Label x="61" y="67" text="RemoteObject:"/>
    16. <s:TextInput x="152" y="57" id="remote_txt"/>
    17. <s:Button x="289" y="58" label="发送" click="button1_clickHandler(event)"/>
    18. <s:Label x="383" y="67" id="remote_result"/>

Flex通信-Java服务端通信实例的更多相关文章

  1. Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主 ...

  2. Android BLE与终端通信(三)——client与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--client与服务端通信过程以及实现数据通信 前面的终究仅仅是小知识点.上不了台面,也仅仅能算是起到一个科普的作用.而同步到实际的开发上去,今天就来延续前两篇 ...

  3. 基于开源SuperSocket实现客户端和服务端通信项目实战

    一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...

  4. Netty入门之客户端与服务端通信(二)

    Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...

  5. 腾讯通信云服务端使用心得,腾讯云IM

    腾讯通信云服务端使用心得 1.腾讯通信服务入口并创建应用 方便使用保留url地址 :   https://cloud.tencent.com/product/im 注册账号腾讯云账号->通过审核 ...

  6. winsock 编程(简单客户&服务端通信实现)

    winsock 编程(简单客户&服务端通信实现) 双向通信:Client send message to Server, and if  Server receive the message, ...

  7. winform 客户端采用HTTP协议与服务端通信

    本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...

  8. winform 客户端 HTTP协议与服务端通信以及解决中文乱码

    本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...

  9. Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.

    Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: ​ ​  ​ 专业理解: socket是应用层与TCP/IP ...

随机推荐

  1. 创建下拉列表并通过ajax填充下拉数据

    $(document).ready(function(e) { jQuery.post('${basePath}/customerService/getCustomerService4List.do' ...

  2. 中文web font技术及方案

    我们在日常需求中,经常会碰到视觉设计师对某个中文字体效果非常坚持的情况,因为页面是否高大上,字体选择是很重要的一个因素,选择合适的字体可以让页面更优雅.面对这种问题,我们通常以下方式来进行设计还原: ...

  3. POJ (线段树) Who Gets the Most Candies?

    这道题综合性挺强的,又牵扯到数论,又有线段树. 线段树维护的信息就是区间中有多少个人没跳出去,然后计算出下一个人是剩下的人中第几个. 我在这调程序调了好久,就是那个模来模去的弄得我头晕. 不过题确实是 ...

  4. 如何快速delete数据

    苦于qa账号,木有drop,truncate权限,同步数据要挨个delete表里边的数据,就写了个脚本,循环删除某个目标库的所有表里边的数据. 先在information_schema的库里边,通过T ...

  5. hadoop NameNode 实现分析

    在hadoop 整体分析中,说过nameNode主要是实现一个 blockID 到对应 dataNode的对应关系映射. 现在分析一下腰实现这个映射,nameNode还需要哪些模块. 1 为了方便用户 ...

  6. c#Winform程序,让pictureBox显示图像(包含GIF),并且不被占用,能即时删除图片。

    最近在做一个图片浏览的工具, 需要在PictureBox中显示图像文件, 包括gif播放.  且不能被程序独占, 就算winform的程序正在显示这张图, 也能在资源管理器里delete它. 看了看网 ...

  7. 学习java之泛型类和泛型方法

    上一篇博文中我自己试着用了下泛型类,昨天看java编程思想一书,发现里面有这么一段话: 使用参数化方法而不是用参数化类的方便之处在于:你不必为需要应用的每种不同类型都使用一个参数去实例化这个类,并且你 ...

  8. 两个异步处理AsyncTask和Handler的优缺点

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操 ...

  9. webpack的学习

    什么是webpack? 他有什么优点? 首先对于很多刚接触webpack人来说,肯定会问webpack是什么?它有什么优点?我们为什么要使用它?带着这些问题,我们来总结下如下: Webpack是前端一 ...

  10. python 对数函数

    from math import logfrom math import e print e #自然对数print log(e) #log函数默认是以e为底print log(100,10) #以10 ...