加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:41:02 所属栏目:百科 来源:网络整理
导读:本文转自:http://blessht.iteye.com/blog/1132934 ? Flex与Java通信的方式有很多种,比较常用的有以下方式: WebService:一种跨语言的在线服务,只要用特定语言写好并部署到服务器,其它语言就可以调用 HttpService:通过http请求的形式访问服务器 RmoteOb

本文转自: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

?

首先创建一个接口:

?

Java代码

?

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

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

?

Java代码

?

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

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

?

Java代码

?

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

为了验证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. ??
  18. <s:Label?x="61"?y="215"?text="WebService:"/>??
  19. ????<s:TextInput?x="152"?y="205"?id="webservice_txt"/>??
  20. ????<s:Button?x="289"?y="206"?label="发送"?click="button3_clickHandler(event)"/>??
  21. ????<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. ???? ??
  4. ????protected?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException?{ ??
  5. ????????this.doPost(request,?response); ??
  6. ????} ??
  7. ??
  8. ????protected?void?doPost(HttpServletRequest?request,?IOException?{ ??
  9. ????????String?name?=?request.getParameter("name"); ??
  10. ????????response.setCharacterEncoding("UTF-8"); ??
  11. ????????PrintWriter?pw?=?response.getWriter(); ??
  12. ????????pw.write("你好["+name+"]这是来自Httpservice的消息...当前Session是:"+request.getSession()); ??
  13. ????????pw.close(); ??
  14. ????} ??
  15. }??
?编写完成后,将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. ??
  17. <SPAN?style="WHITE-SPACE:?pre">?</SPAN><s:Label?x="61"?y="138"?text="HttpService:"/>??
  18. ????<s:TextInput?x="152"?y="128"?id="http_txt"/>??
  19. ????<s:Button?x="289"?y="129"?label="发送"?click="button2_clickHandler(event)"/>??
  20. ????<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. ??
  3. import?flex.messaging.FlexContext; ??
  4. ??
  5. public?class?RemoteClass?{ ??
  6. ????public?String?helloRemote(String?name){ ??
  7. ????????return?"你好["+name+"]这是来自JavaRemote的消息...当前Session是:"+FlexContext.getHttpRequest().getSession(); ??
  8. ????} ??
  9. }??

?随后在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. ??
  6. ????<!--?MessageBroker?Servlet?-->??
  7. ????<servlet>??
  8. ????????<display-name>MessageBrokerServlet</display-name>??
  9. ????????<servlet-name>MessageBrokerServlet</servlet-name>??
  10. ????????<servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>??
  11. ????????<init-param>??
  12. ????????????<param-name>services.configuration.file</param-name>??
  13. ????????????<param-value>/WEB-INF/flex/services-config.xml</param-value>??
  14. ???????</init-param>??
  15. ????????<load-on-startup>1</load-on-startup>??
  16. ????</servlet>??
  17. ???? ??
  18. ????<servlet>??
  19. ????????<display-name>RDSDispatchServlet</display-name>??
  20. ????????<servlet-name>RDSDispatchServlet</servlet-name>??
  21. ????????<servlet-class>flex.rds.server.servlet.FrontEndServlet</servlet-class>??
  22. ????????<init-param>??
  23. ????????????<param-name>useAppserverSecurity</param-name>??
  24. ????????????<param-value>false</param-value>??
  25. ????????</init-param>???????? ??
  26. ????????<load-on-startup>10</load-on-startup>??
  27. ????</servlet>??
  28. ??
  29. ????<servlet-mapping?id="RDS_DISPATCH_MAPPING">??
  30. ????????<servlet-name>RDSDispatchServlet</servlet-name>??
  31. ????????<url-pattern>/CFIDE/main/ide.cfm</url-pattern>??
  32. ????</servlet-mapping>??
  33. ???? ??
  34. ????<servlet-mapping>??
  35. ????????<servlet-name>MessageBrokerServlet</servlet-name>??
  36. ????????<url-pattern>/messagebroker/*</url-pattern>??
  37. ????</servlet-mapping>??

?

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

Xml代码

?

  1. <service?id="remoting-service"?class="flex.messaging.services.RemotingService">??
  2. ??
  3. ????<adapters>??
  4. ????????<adapter-definition?id="java-object"??
  5. ????????????class="flex.messaging.services.remoting.adapters.JavaAdapter"??
  6. ????????????default="true"?/>??
  7. ????</adapters>??
  8. ??
  9. ????<default-channels>??
  10. ????????<channel?ref="my-amf"?/>??
  11. ????</default-channels>??
  12. ???? ??
  13. ????<!--?定义远程调用的目标名?-->??
  14. ????<destination?id="remoteClass">??
  15. ????????<properties>??
  16. ????????????<source>blaseds.RemoteClass</source>??
  17. ????????</properties>??
  18. ????</destination>??
  19. </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. ??
  18. <s:Label?x="61"?y="67"?text="RemoteObject:"/>??
  19. ????<s:TextInput?x="152"?y="57"?id="remote_txt"/>??
  20. ????<s:Button?x="289"?y="58"?label="发送"?click="button1_clickHandler(event)"/>??
  21. ????<s:Label?x="383"?y="67"?id="remote_result"/>??
?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读