Flex通信-Java服务端通信实例
转自: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
首先创建一个接口:
- package webservice;
 - import javax.jws.WebService;
 - @WebService
 - public interface HelloWebservice {
 - public String getWebservice(String name);
 - }
 
然后创建该接口的实现类:
- package webservice;
 - import javax.jws.WebService;
 - @WebService(endpointInterface="webservice.HelloWebservice",serviceName="hellows",portName="hellowsport")
 - public class HelloWebserviceImpl implements HelloWebservice{
 - public String getWebservice(String name) {
 - return "你好["+name+"]这是来自webservice的信息..."+this;
 - }
 - }
 
最后创建服务器端启动代码,只要运行main方法即可。当前WebService没有部署在tomcat之类的服务器下,而是通过jetty部署的:
- package webservice;
 - import javax.xml.ws.Endpoint;
 - public class WebserviceServer {
 - protected WebserviceServer() throws Exception {
 - // START SNIPPET: publish
 - System.out.println("Server Starting...");
 - HelloWebservice hello = new HelloWebserviceImpl();
 - String address = "http://localhost:8888/hellows";
 - Endpoint.publish(address, hello);
 - // END SNIPPET: publish
 - }
 - public static void main(String[] args) throws Exception {
 - //启动web服务
 - new WebserviceServer();
 - System.out.println("Server ready...");
 - Thread.sleep( * * );
 - System.out.println("Server exiting...");
 - System.exit();
 - }
 - }
 
为了验证WebService是否启动成功,可以在浏览器下放入如下地址:http://localhost:8888/hellows?wsdl,如果部署成功,则浏览器会显示wsdl的xml配置信息。
【Flex端代码】
- <fx:Script>
 - <![CDATA[
 - //WebService调用
 - protected function button3_clickHandler(event:MouseEvent):void
 - {
 - var ws:WebService = new WebService();
 - ws.wsdl = "http://localhost:8888/hellows?wsdl";
 - ws.loadWSDL();
 - ws.getWebservice(webservice_txt.text);
 - ws.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{
 - webservice_result.text = e.result.toString()
 - });
 - }
 - ]]>
 - </fx:Script>
 - <s:Label x="61" y="215" text="WebService:"/>
 - <s:TextInput x="152" y="205" id="webservice_txt"/>
 - <s:Button x="289" y="206" label="发送" click="button3_clickHandler(event)"/>
 - <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请求响应例子。
- public class HelloHttp extends HttpServlet {
 - private static final long serialVersionUID = 1L;
 - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 - this.doPost(request, response);
 - }
 - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 - String name = request.getParameter("name");
 - response.setCharacterEncoding("UTF-8");
 - PrintWriter pw = response.getWriter();
 - pw.write("你好["+name+"]这是来自Httpservice的消息...当前Session是:"+request.getSession());
 - pw.close();
 - }
 - }
 
 编写完成后,将java项目部署到服务器中(我使用的是tomcat)。
【Flex代码】
Flex端需要创建一个HttpService对象来访问刚才的Servlet:
- <SPAN style="WHITE-SPACE: pre"> </SPAN><fx:Script>
 - <![CDATA[
 - //HttpService的形式访问Java服务器
 - protected function button2_clickHandler(event:MouseEvent):void
 - {
 - var http:HTTPService = new HTTPService();
 - http.url = "http://localhost:8080/JavaToFlex/HelloHttp?name="+http_txt.text;
 - http.send();
 - http.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{
 - http_result.text = e.result.toString();
 - });
 - }
 - ]]>
 - </fx:Script>
 - <SPAN style="WHITE-SPACE: pre"> </SPAN><s:Label x="61" y="138" text="HttpService:"/>
 - <s:TextInput x="152" y="128" id="http_txt"/>
 - <s:Button x="289" y="129" label="发送" click="button2_clickHandler(event)"/>
 - <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类:
- package blaseds;
 - import flex.messaging.FlexContext;
 - public class RemoteClass {
 - public String helloRemote(String name){
 - return "你好["+name+"]这是来自JavaRemote的消息...当前Session是:"+FlexContext.getHttpRequest().getSession();
 - }
 - }
 
随后在web.xml中添加如下内容(这些配置在Blaseds文件的web.xml中都能找到):
- <!-- Http Flex Session attribute and binding listener support -->
 - <listener>
 - <listener-class>flex.messaging.HttpFlexSession</listener-class>
 - </listener>
 - <!-- MessageBroker Servlet -->
 - <servlet>
 - <display-name>MessageBrokerServlet</display-name>
 - <servlet-name>MessageBrokerServlet</servlet-name>
 - <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
 - <init-param>
 - <param-name>services.configuration.file</param-name>
 - <param-value>/WEB-INF/flex/services-config.xml</param-value>
 - </init-param>
 - <load-on-startup>1</load-on-startup>
 - </servlet>
 - <servlet>
 - <display-name>RDSDispatchServlet</display-name>
 - <servlet-name>RDSDispatchServlet</servlet-name>
 - <servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>
 - <init-param>
 - <param-name>useAppserverSecurity</param-name>
 - <param-value>false</param-value>
 - </init-param>
 - <load-on-startup>10</load-on-startup>
 - </servlet>
 - <servlet-mapping id="RDS_DISPATCH_MAPPING">
 - <servlet-name>RDSDispatchServlet</servlet-name>
 - <url-pattern>/CFIDE/main/ide.cfm</url-pattern>
 - </servlet-mapping>
 - <servlet-mapping>
 - <servlet-name>MessageBrokerServlet</servlet-name>
 - <url-pattern>/messagebroker/*</url-pattern>
 - </servlet-mapping>
 
最后打开Java项目,打开/WEB-INF/flex/remoting-config.xml文件,在文件中添加RemoteClass的远程支持:
- <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="remoteClass">
 - <properties>
 - <source>blaseds.RemoteClass</source>
 - </properties>
 - </destination>
 - </service>
 
随后将Java项目部署到服务器中。
【Flex端代码】
Flex端为了调用Java代码,需要创建一个RemoteObject实例,属性destination就是在Java端remoting-config.xml文件中定义的<destination id="remoteClass">,这样你可以把RemoteObject当作一个RemoteClass的实例使用。
- <fx:Script>
 - <![CDATA[
 - //RemoteObject远程调用Java方法
 - protected function button1_clickHandler(event:MouseEvent):void
 - {
 - var remote:RemoteObject = new RemoteObject();
 - remote.destination = "remoteClass";
 - remote.helloRemote(remote_txt.text);
 - remote.addEventListener(ResultEvent.RESULT,function callback(e:ResultEvent):void{
 - remote_result.text = e.result.toString();
 - });
 - }
 - ]]>
 - </fx:Script>
 - <s:Label x="61" y="67" text="RemoteObject:"/>
 - <s:TextInput x="152" y="57" id="remote_txt"/>
 - <s:Button x="289" y="58" label="发送" click="button1_clickHandler(event)"/>
 - <s:Label x="383" y="67" id="remote_result"/>
 
Flex通信-Java服务端通信实例的更多相关文章
- Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信
		
Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主 ...
 - Android BLE与终端通信(三)——client与服务端通信过程以及实现数据通信
		
Android BLE与终端通信(三)--client与服务端通信过程以及实现数据通信 前面的终究仅仅是小知识点.上不了台面,也仅仅能算是起到一个科普的作用.而同步到实际的开发上去,今天就来延续前两篇 ...
 - 基于开源SuperSocket实现客户端和服务端通信项目实战
		
一.课程介绍 本期带给大家分享的是基于SuperSocket的项目实战,阿笨在实际工作中遇到的真实业务场景,请跟随阿笨的视角去如何实现打通B/S与C/S网络通讯,如果您对本期的<基于开源Supe ...
 - Netty入门之客户端与服务端通信(二)
		
Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...
 - 腾讯通信云服务端使用心得,腾讯云IM
		
腾讯通信云服务端使用心得 1.腾讯通信服务入口并创建应用 方便使用保留url地址 : https://cloud.tencent.com/product/im 注册账号腾讯云账号->通过审核 ...
 - winsock 编程(简单客户&服务端通信实现)
		
winsock 编程(简单客户&服务端通信实现) 双向通信:Client send message to Server, and if Server receive the message, ...
 - winform 客户端采用HTTP协议与服务端通信
		
本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...
 - winform 客户端 HTTP协议与服务端通信以及解决中文乱码
		
本来从来没有仔细研究过Http协议,今天因为公司业务需求,调试了半天,终于现在会Winform用Http协议与服务端通信了,其中常用的有POST和Get方式: 仔细看了人人网和新浪等大部分都是采用GE ...
 - Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.
		
Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字:    专业理解: socket是应用层与TCP/IP ...
 
随机推荐
- (4)FTP服务器下载文件
			
上一篇中,我们提到了怎么从FTP服务器下载文件.现在来具体讲述一下. 首先是路径配置.. 所以此处我们需要一个app.config来设置路径. <?xml version="1.0&q ...
 - JavaScript 中 2个等号(==)和 3个等号(===)之间的区别
			
JavaScript(JS)中有3个和等号(=)相关的操作符:赋值运算符(=).等于(==).恒等于(===). 赋值运算符不多说了. 这里说说等于和恒等于. ==,等于:两边值类型不同的时候,会自动 ...
 - Win XP 如何禁用系统的自动更新
			
想关闭系统的自动更新. 打开[控制面板]/[安全中心],发现“自动更新”和“更改安全中心通知我的方式”,都已成了灰色,无法更改. 网上查了一下,找到了这样一个处理方法:将[服务]中一个名为“Autom ...
 - 关于RotateAnimation的各构造方法的参数
			
本文以RotateAnimation的构造方法 讲解. RotateAnimation(float fromDegrees, float toDegrees) 其他构造器的旋转也可参考这副图. Rot ...
 - jpa+spring配置多数据源
			
property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test?useU ...
 - UVa 1442 (线性扫描) Cave
			
对于一个水坑,水平面肯定是相等的.(废话,不然为什么叫水ping面) 因为水面不能碰到天花板,所以将水面向两边延伸要么碰到墙壁要么延伸到洞穴外面去. 设h(i)表示向左延伸不会碰到天花板的最高水平面, ...
 - [Swift系列]002-基础语法
			
基础语法就那老几样,很快可以说完 [常量.变量] 1.变量用 var,系统自动去判断类型,但变量再次赋值需保持数据类型一致 var a=50 相信用过js/java/C#的,对这个var都不陌生 使 ...
 - I.MX6 uSDHC SD card register
			
/**************************************************************************** * I.MX6 uSDHC SD card ...
 - 2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题  [转]
			
笔试(45 minute):(本来是四张纸,被我弄丢了一张!无伤大雅,难度级别不会有出入) 注意:由于时间紧迫和水平有限,难免有不足或错误,请指证,虚心学习! [PHP] 写出PHP中至少5个全局变量 ...
 - dede 首页调用单页->栏目内容
			
{dede:sql sql='Select content from dede_arctype where id=47'} [field:content/] {/dede:sql}