Flex+BlazeDS+AIR+StreamingAMFChannel消息服务的即时聊天通信
采用BlazeDS的StreamingAMFChannel 消息服务的聊天通信,这种方式是最快和延迟最小的了。
BusyChat.mxml文件:
<?xml version="1.0" encoding="utf-8"?><s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" width="560" creationComplete="consumer.subscribe();"> <fx:Script> <![CDATA[ import mx.messaging.messages.AsyncMessage; import mx.messaging.messages.IMessage; private function send():void { var message:IMessage = new AsyncMessage(); message.body.chatMessage = msg.text+consumer.clientId; producer.send(message); msg.text = ""; } private function messageHandler(message:IMessage):void { log.text += message.body.chatMessage + "\n"; } ]]> </fx:Script> <fx:Declarations> <mx:ChannelSet id="cs"> <mx:StreamingAMFChannel url="http://localhost:8050/BusyChat/messagebroker/streamingamf"/> </mx:ChannelSet> <mx:Producer id="producer" destination="chat" channelSet="{cs}"/> <mx:Consumer id="consumer" destination="chat" channelSet="{cs}" message="messageHandler(event.message)"/> </fx:Declarations> <s:Panel title="Chat Test!" x="20" y="19" width="518" height="295"> <s:TextArea id="log" x="19" y="11" width="473" height="166"/> <s:TextInput id="msg" x="19" y="191" width="377" height="46" enter="send()"/> <s:Button x="411" y="192" label="发送消息" height="43" width="77" click="send()"/> </s:Panel> </s:WindowedApplication><?xml version="1.0" encoding="UTF-8"?><service id="message-service" default="true" /> <adapter-definition id="jms" /> </channels> </destination> </service>
<?xml version="1.0" encoding="UTF-8"?><service id="proxy-service" default="true"/> <adapter-definition id="soap-proxy" name="code"><?xml version="1.0" encoding="UTF-8"?><service id="remoting-service" default="true"/> </adapters> <default-channels> <channel ref="my-amf"/> </default-channels></service>
<?xml version="1.0" encoding="UTF-8"?><services-config> <services> <service-include file-path="remoting-config.xml" /> <service-include file-path="proxy-config.xml" /> <service-include file-path="messaging-config.xml" /> <default-channels> <channel ref="my-streaming-amf"/> </default-channels> </services> <security> <login-command server="Tomcat"/> <!-- Uncomment the correct app server <login-command server="JBoss"> <login-command server="JRun"/> <login-command server="Weblogic"/> <login-command server="WebSphere"/> --> <!-- <security-constraint id="basic-read-access"> <auth-method>Basic</auth-method> <roles> <role>guests</role> <role>accountants</role> <role>employees</role> <role>managers</role> </roles> </security-constraint> --> </security> <channels> <channel-definition id="my-streaming-amf" kickstart-bytes="2048" max-streaming-connections-per-session="1"/> <user-agent match-on="Firefox" kickstart-bytes="2048" max-streaming-connections-per-session="1"/> </user-agent-settings> </properties> </channel-definition> <channel-definition id="my-amf" level="Error"> <properties> <prefix>[BlazeDS] </prefix> <includeDate>false</includeDate> <includeTime>false</includeTime> <includeLevel>false</includeLevel> <includeCategory>false</includeCategory> </properties> <filters> <pattern>Endpoint.*</pattern> <pattern>Service.*</pattern> <pattern>Configuration</pattern> </filters> </target> </logging> <system> <redeploy> <enabled>false</enabled> <!-- <watch-interval>20</watch-interval> <watch-file>{context.root}/WEB-INF/flex/services-config.xml</watch-file> <watch-file>{context.root}/WEB-INF/flex/proxy-config.xml</watch-file> <watch-file>{context.root}/WEB-INF/flex/remoting-config.xml</watch-file> <watch-file>{context.root}/WEB-INF/flex/messaging-config.xml</watch-file> <watch-file>{context.root}/WEB-INF/flex/data-management-config.xml</watch-file> <touch-file>{context.root}/WEB-INF/web.xml</touch-file> --> </redeploy> </system></services-config><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app> <display-name>BlazeDS</display-name> <description>BlazeDS Application</description> <!-- Http Flex Session attribute and binding listener support --> <listener> <listener-class>flex.messaging.HttpFlexSession</listener-class> </listener> <!-- MessageBroker Servlet --> <servlet> <servlet-name>MessageBrokerServlet</servlet-name> <display-name>MessageBrokerServlet</display-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-mapping> <servlet-name>MessageBrokerServlet</servlet-name> <url-pattern>/messagebroker/*</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> </welcome-file-list> <!-- for WebSphere deployment, please uncomment --> <!-- <resource-ref> <description>Flex Messaging WorkManager</description> <res-ref-name>wm/MessagingWorkManager</res-ref-name> <res-type>com.ibm.websphere.asynchbeans.WorkManager</res-type> <res-auth>Container</res-auth> <res-sharing-scope>Shareable</res-sharing-scope> </resource-ref> --></web-app>