当前位置: 首页 > 编程日记 > 正文

Flex通信-Java服务端通信实例

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

首先创建一个接口:

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

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

Java代码  收藏代码
  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部署的:

Java代码  收藏代码
  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(5 * 60 * 1000);    
  17. System.out.println("Server exiting...");  
  18. System.exit(0);  
  19. }
  20. }

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

【Flex端代码】

Xml代码  收藏代码
  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.               ]]>  
  16. </fx:Script>  
  17. <s:Label x="61" y="215" text="WebService:"/>  
  18. <s:TextInput x="152" y="205" id="webservice_txt"/>  
  19. <s:Button x="289" y="206" label="发送" click="button3_clickHandler(event)"/>  
  20. <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请求响应例子。

Java代码  收藏代码
  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:

Xml代码  收藏代码
  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.             ]]>  
  15. </fx:Script>  
  16. <span style="white-space: pre;">    </span><s:Label x="61" y="138" text="HttpService:"/>  
  17. <s:TextInput x="152" y="128" id="http_txt"/>  
  18. <s:Button x="289" y="129" label="发送" click="button2_clickHandler(event)"/>  
  19. <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类:

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中都能找到):

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的远程支持:

Xml代码  收藏代码
  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的实例使用。

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

附件分享一下三种通信的实例代码

jar文件太大所以去掉了,大家可以自己去官网下载相应jar包



本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4191045.html,如需转载请自行联系原作者

相关文章:

jQuery性能优化指南

1&#xff0c;总是从ID选择器开始继承 在jQuery中最快的选择器是ID选择器&#xff0c;因为它直接来自于JavaScript的getElementById()方法。 例如有一段HTML代码&#xff1a; <div id"content"> <form method"post" action"#"> &l…

速度快到飞起 如何跟蜻蜓的大脑学习计算?

编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 科学家研究了其中一种大型昆虫蜻蜓的大脑&#xff0c;希望利用这些昆虫的专长来设计计算系统&#xff0c;这些系统针对拦截来袭导弹或跟踪气味羽流等任务进行了优化。通过利用蜻蜓神经系统的速度、简单性和效率&#xff0c;目…

Python、Unicode和中文

python的中文问题一直是困扰新手的头疼问题&#xff0c;这篇文章将给你详细地讲解一下这方面的知识。当然&#xff0c;几乎可以确定的是&#xff0c;在将来的版本中&#xff0c;python会彻底解决此问题&#xff0c;不用我们这么麻烦了。先来看看python的版本&#xff1a;>&g…

提高mysql性能的开源软件

今天发现一个开源软件,看介绍可以提高mysql的性能,这个东西就是Google的开源TCMalloc库,于是拿来装了下看看效果.这个软件下载地址是:http://code.google.com/p/google-perftools/downloads/list,我用的是最新版的google-perftools-1.4.tar.gz.1.安装过程:#tar zxvf google-per…

一款比较实用齐全的jQuery 表单验证插件

一款比较实用,并且验证类型齐全的jQuery表单验证插件.英文版原作者Vanadium,由我做中文整理.E文水平有限,如果翻译的有问题的,请大家指出,在此感谢~可以验证哪些? 文字,日期,邮箱,网址,数字,AJAX用户名验证以及自定义的正则等等几乎所有我们要用到的验证.不多说,看DEMO吧: 点此…

[原]VS2012编译GLEW 1.11

1、到http://glew.sourceforge.net/下载源代码 2、使用vs2012打开build下vc6的glew.dsw &#xff0c;自动生成2012工程&#xff08;一路点确定&#xff09;特别注意&#xff1a;不要使用build下的vc12之类的 本人亲测不好使 坑了我很久 3、直接生成解决方案&#xff0c;会在根目…

长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻

整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚&#xff0c;雷军年度演讲及小米秋季发布会在线上召开&#xff0c;此次发布会足足讲了三个小时&#xff0c;不仅介绍了小米的目前市场状况&#xff0c;还分享了新品以及小米机器人实验室的第一款产品——机器狗「铁…

java中图片文件的判断

javax.imageio 类 ImageIO BufferedImage bi ImageIO.read(resFile);//resFile --- InputStreamif(bi null){ System.out.println(此文件不为图片文件); }try {//判断是否为图片文件并且返回图片的格式&#xff01;ImageInputStream iis ImageIO.createImageInputStream(o)…

jQuery中常用的函数方法总结

jQuery中为我们提供了很多有用的方法和属性&#xff0c;自己总结的一些常用的函数&#xff0c;方法。个人认为在www.21kaiyun.com的紫微斗数星座在线排盘开发中会比较常用的&#xff0c;仅供大家学习和参考。 事件处理 ready(fn) 代码&#xff1a;$(document).ready(functi…

使用editcap命令将ERF格式转换为pcap格式

editcap是Wireshark的一个组件&#xff0c;在Windows平台下&#xff0c;只要完成Wireshark的安装&#xff0c;就可以在安装目录中看到editcap.exe。editcap.exe需要在命令行中使用。 对于用Endace DAG捕捉卡捕获的数据包&#xff0c;一般来说&#xff0c;都是erf格式的。ERF格式…

中关村开源创新大赛-达闼赛道如火如荼进行中

导语为庆祝中国共产党成立100周年&#xff0c;中关村软件园携手云端机器人运营商达闼&#xff0c;联合举办了中关村开源创新大赛-达闼赛道&#xff0c;暨“不忘初心 AI创时代”达闼智能服务机器人编舞大赛。在小姜的灵动舞姿下&#xff0c;今天&#xff0c;达闼赛道正式启动&am…

国际版Azure搭建Windows多种类型×××_三.配置SSTP ×××连接服务

安全套接字隧道协议&#xff08;SSTP&#xff09;是一种新的***隧道形式&#xff0c;具有允许流量通过阻止PPTP和L2TP / IPsec流量的防火墙的功能。 SSTP提供了一种在HTTPS协议的SSL通道上封装PPP流量的机制。 PPP的使用允许支持强认证方法&#xff0c;如EAP-TLS。 使用HTTPS意…

超强的jquery极品插件--色彩选择器类/ 右键菜单类/ 图片新闻flash展示类

Farbtastic Farbtastic是一个color picker插件。它能够在一个页面中加入多个颜色选择控件&#xff0c;然后每个控件关联到页面中的一个元素比如&#xff1a;文本输入框。FarbtasticjQuery Color Picker 21世纪开运网在线排盘星座就成功运用这些技巧&#xff0c;www.21kaiyun.co…

张口闭口就是焦虑,现在的程序员怎么了?

【CSDN 编者按】在网上&#xff0c;我们经常会看到各类程序员的吐槽&#xff0c;学历焦虑、大厂焦虑充斥着手机屏幕&#xff0c;本文作者从这一角度出发&#xff0c;用质朴的文字告诉年轻一代程序员一个事实&#xff1a;慢慢走好编程每一步&#xff0c;不要害怕更不用着急&…

epoll 的实现原理以及与poll,select 的对比

最近面试的时候 被问到epoll的问题&#xff0c;就下来查一查&#xff0c;看到有篇文章不错&#xff0c;就记录下来&#xff0c;供大家参考学习。 以一个生活中的例子来解释. 假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你…

js 字符串转换成数字的 三种方法

在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形式的.在网上找了一下js字符串转数字的文章,这个比较全方法主要有三种 转换函数、强制类型转换、利用js…

Web 开发与设计之 Google 兵器谱

Google 的使命是 Web&#xff0c;在 Google 眼中&#xff0c;未来的一切应用都将 Web 化&#xff0c;一直以来&#xff0c;Google 为 Web 开发与设计者推出了大量免费工具&#xff0c;让他们更好地创建&#xff0c;维护&#xff0c;改善他们的 Web 站点&#xff0c;这些工具包含…

html5新标签使用

HTML 5 视频标签<video> <video width"320" height"240" controls"controls"><source src"/i/movie.ogg" type"video/ogg"><source src"/i/movie.mp4" type"video/mp4">Your b…

调查:“AI红娘”来了,有一半人选择相信TA

作者&#xff1a;REN来源&#xff1a;数据实战派七夕AI红娘来了前言你会相信人工智能&#xff08;AI&#xff09;给你推荐的约会对象吗&#xff1f;最近&#xff0c;卡巴斯基的一项全球调查显示&#xff0c;在使用交友或约会软件时&#xff0c; 44% 的受访者愿意接受 AI 或算法…

Mysql技术内幕——InnoDB存储引擎

一&#xff0e;mysql体系结构和存储引擎 1.1、数据库和实例的区别 数据库&#xff1a;物理操作系统或其他形式文件类型的集合。在mysql下数据库文件可以是frm&#xff0c;myd&#xff0c;myi&#xff0c;ibd结尾的文件。 数据库实例&#xff1a;由数据库后台进程/线程以及一个共…

jQuery插件开发 - 其实很简单

【前言】jQuery已经被广泛使用&#xff0c;凭借其简洁的API&#xff0c;对DOM强大的操控性&#xff0c;易扩展性越来越受到web开发人员的喜爱&#xff0c;我在社区也发布了很多的jQuery插件&#xff0c;经常有人询问一些技巧&#xff0c;因此干脆写这么一篇文章给各位jQuery爱好…

直接选择排序算法

直接选择排序算法 1、选择排序 #include <stdio.h> #include <stdlib.h> #define N 5 //排序的数据个数 typedef struct Num {int data[N-1];int length; }Num;int main(int argc, char *argv[]) {int i,j,min;struct Num La;printf("请输入您要排序的数字序…

大厂的面试官是如何挑人的?

马上就又要到金九银十求职的黄金期了&#xff0c;最近找了很多资深面试官聊天&#xff0c;他们说其实他们每天都要面试考核很多应聘者&#xff0c;但是通过的人却寥寥无几。。为了帮助大家更好的了解大厂面试的知识方向&#xff0c;特别拿出了某大厂大佬整理的非常全面的大厂 A…

使用Mono管理Coyote Linux

Coyote是一个个人防火墙配置Linux的目的是为了保护家庭或教育网络. 这个防火墙产品牌的个人及教育用途,并提供免费下载&#xff1a;http://coyotelinux.com/ CoyoteLinux uses Mono for syadmin tools http://www.coyotelinux.com.cn/index.htm 本文转自 张善友 51CTO博客&…

介绍几款浏览器兼容性测试工具

昨天和朋友聊到了有关浏览器兼容性的问题&#xff0c;在开发中有时的确很让人苦恼&#xff0c;我向他推荐了几款测试浏览器兼容的工具&#xff0c;分享给大伙&#xff0c;有什么更好的工具或是解决方法还希望大家拿出来晒一晒。 IETester 这是我最先用的测试浏览器兼容性的工…

关于android.view.WindowLeaked(窗体泄露)的解决方案

虽然是小问题一个&#xff0c;但也困扰了我一段时间&#xff0c;现在记下来&#xff0c;给自己做个备忘&#xff0c;也可以给其他人一个参考 Java代码 view plaincopy to clipboardprint? 01-08 01:49:27.874: ERROR/WindowManager(473): Activity com.photos.MainActivity …

英伟达推出全球首个元宇宙平台,豪砸数亿是为什么?

编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) NVIDIA 在 SIGGRAPH 推出首个全球元宇宙平台&#xff0c;并赢得了最佳展示奖。目前处于公测阶段&#xff0c;它对 NVIDIA RTX 和 GeForce RTX GPU 用户免费开放。用户在安装完 NVIDIA Studio 驱动程序后&#xff0c;即可获得…

route命令相关整理

目录&#xff1a; 1. 使用背景 2. route命令 2.1 打印路由信息 2.2 删除路由信息 2.3 添加路由信息 3. 应用实例 3.1 详解案例 3.2 内外网同时上网办法集锦 4、“路由添加失败&#xff0c;找不到元素” 1. 使用背景 需要接入两个网络&#xff0c;一个是部署环境所在内网…

ASP.NET画图控件 Chart Control 免费控件

.NET3.5中中推出了图表控件&#xff0c;可以同时支持Web和WinForm两种方式&#xff0c;由于平时很少使用&#xff0c;一直没有玩玩&#xff0c;闲来无事&#xff0c;简单研究了下&#xff0c;感觉功能真的很强大&#xff0c;基本上可以满足各种图表的应用&#xff0c;感觉这么好…

一步步学敏捷开发:开篇

一步步学敏捷开发&#xff1a;开篇 http://www.cnblogs.com/jetlian/p/3913687.html