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
首先创建一个接口:
- 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(5 * 60 * 1000);
- System.out.println("Server exiting...");
- System.exit(0);
- }
- }
为了验证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"/>
附件分享一下三种通信的实例代码
jar文件太大所以去掉了,大家可以自己去官网下载相应jar包
本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4191045.html,如需转载请自行联系原作者
Flex通信-Java服务端通信实例相关推荐
- socket java 客户端_Java基于socket实现的客户端和服务端通信功能完整实例
本文实例讲述了Java基于socket实现的客户端和服务端通信功能.分享给大家供大家参考,具体如下: 以下代码参考马士兵的聊天项目,先运行ChatServer.java实现端口监听,然后再运行Chat ...
- gPRC简介以及Java中使用gPRC实现客户端与服务端通信(附代码下载)
场景 ProtoBuf的介绍以及在Java中使用protobuf将对象进行序列化与反序列化: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
- 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互
基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...
- c++socket多个客户端通过不同端口与一个服务端通信_手写RPC,深入底层理解整个RPC通信...
一.前言 RPC,远程过程调用,调用远程方法像调用本地方法一样.RPC交互分为客户端和服务端,客户端调用服务端方法,服务端接收数据并打印到控制台,并response响应给客户端. RPC和HTTP的联 ...
- java socket同步通信,javasocket客户端与服务端同步通信实例
javasocket客户端与服务端同步通信实例 工作中没涉及有关JA V A SOCKET编程的实际经历,但理论大概了解.想正明一下自已的对JA V A SOCKET理解写个通信TEST,通过TEST ...
- 浅议C#客户端和服务端通信的几种方法:Rest和GRPC和其他
本文来自:https://michaelscodingspot.com/rest-vs-grpc-for-asp-net/ 浅议C#客户端和服务端通信的几种方法:Rest和GRPC 在C#客户端和C# ...
- 警察与小偷的实现之中的一个client与服务端通信
警察与小偷的实现之中的一个client与服务端通信 来源于ISCC 2012 破解关第四题 目的是通过逆向police.实现一个thief,可以与police进行通信 实际上就是一个RSA加密通信的样 ...
- Linux Socket 两个客户端通信,服务端作为中转
Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...
- 前端3DOM编程3——Ajax和服务端通信
1.通信基础 2.HTTP协议 3.Ajax 4.cookie 六.Ajax和服务端通信 1.通信基础 (1)Web服务器搭建 服务器是一台24h不断电.不关机,提供某种服务(文件. ...
最新文章
- JSON序列化(stringify)对象时排除某些属性的两种方法
- 【学习求职必备】百度AI和它的7大AI黑科技
- 什么是爱?什么是幸福?
- wimbuilder2教程_Wimbuilder WIN10XPE制作所需的工程文件
- 基于JAVA+SpringMVC+Mybatis+MYSQL的实习生招聘网站
- Lisp获取偏置后对象的坐标点_三坐标测量基础知识2020
- linux cpu load命令,Linux性能检测常用的10个基本命令
- 现代通信原理3.3:两个重要的信号处理模块-乘法器与滤波器
- sonar小白式入门
- 精讲RestTemplate第6篇-文件上传下载与大文件流式下载
- psn注册什么服务器,怎么注册PSN港服账号?PSN港服官网注册教程
- 这么多2B项目管理软件,怎么选?
- introduction
- STM32 CAN通信之二:正常模式
- linux如何批量改名,Linux 批量改名之 rename 命令
- 3650m5设置u盘启动_联想启天M415设置u盘启动步骤(支持uefi/bios双启动)
- android recovery中文下载地址,Android Recovery模式与Recovery界面的中文详细说明
- postman和newman
- 计算机二级软件VC++6.0下载地址
- ai电销机器人系统搭建开发-通话模块