利用Flash XML Socket实现”服务器推”技术的基础是:1.Flash提供了XMLSocket类,服务器利用Socket向Flash发送数据;2.JavaScript和Flash的紧密结合,JavaScript和as可以相互调用。
具体实现的方法:在HTML页面中陷入一个使用了XMLSocket类的Falsh程序。JavaScript通过调用此Flash程序提供的套接口接口与服务端的套接口进行通信。JavaScript在收到服务器端以XML格式传送的信息控制HTML的Dom对象改变页面的内容显示。
一、XMLSocket简介
XMLSocket 类实现了客户端套接字,这使得运行 Flash Player 的计算机可以与由 IP 地址或域名标识的服务器计算机进行通信。 对于要求滞后时间较短的客户端/服务器应用程序,如实时聊天系统,XMLSocket 类非常有用。 传统的基于 HTTP 的聊天解决方案频繁轮询服务器,并使用 HTTP 请求来下载新的消息。 与此相对照,XMLSocket 聊天解决方案保持与服务器的开放连接,这一连接允许服务器即时发送传入的消息,而无需客户端发出请求。 若要使用 XMLSocket 类,服务器计算机必须运行可识别 XMLSocket 类使用的协议的守护程序。可以参考XMLSocket简介。
二、AS与JavaScript通信
利用ExternalInterface可以实现AS与JavaScript的通信,具体请看Flex与JavaScript交互。
三、实现Socket
客户端Flex:
1: <?xml version="1.0" encoding="utf-8"?>
2: <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
3: <mx:Script>
4: <![CDATA[
5: private var socket:XMLSocket=new XMLSocket();
6:
7: private function ConncetServer():void
8: {
9: socket.addEventListener(DataEvent.DATA,OnReceived);
10: socket.addEventListener(Event.CONNECT , onConnected);
11: this.socket.connect("127.0.0.1",8080);
12: }
13:
14: private function onConnected(event:Event):void
15: {
16: socket.send("begin connect");
17: this.txtContent.text=this.txtContent.text+"conect success
";
18: }
19:
20: private function Send():void
21: {
22: socket.send("message from flex");
23: }
24:
25: private function OnReceived(event:DataEvent):void
26: {
27: trace("receive data.");
28: this.txtContent.text=this.txtContent.text+"
"+ event.text;
29: }
30: ]]>
31: </mx:Script>
32:
33: <mx:Button label="Connect" fontSize="12" id="btnConnect" left="10" top="20" click="ConncetServer()"/>
34: <mx:Button label="Send" fontSize="12" id="btnSend" left="80" top="20" click="Send();" />
35: <mx:TextArea borderColor="#010A10" id="txtContent" left="10" top="110" right="10" bottom="10" backgroundColor="#DEEEF3" cornerRadius="12"/>
36: </mx:Application>
Socket服务端:
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Net;
6: using System.Net.Sockets;
7: using System.Threading;
8:
9: namespace SocketServer
10: {
11: class Program
12: {
13: static bool ServiceStartFlag = false;
14: static Socket socket;
15: static Thread thread;
16:
17: static void Main(string[] args)
18: {
19: socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
20: IPHostEntry ieh = Dns.GetHostEntry("localhost");
21: IPAddress localServerIP = ieh.AddressList[1];
22: IPEndPoint localIPEndPoint = new IPEndPoint(localServerIP, 8080);
23:
24: socket.Bind(localIPEndPoint);
25: socket.Listen(600);
26:
27: thread = new Thread(new ThreadStart(AcceptClient));
28: thread.IsBackground = true;
29: thread.Start();
30:
31: Console.ReadLine();
32: }
33:
34: static void AcceptClient()
35: {
36: ServiceStartFlag = true;
37:
38: while (ServiceStartFlag)
39: {
40: try
41: {
42: Socket newSocket = socket.Accept();
43: string onemessge = "<cross-domain-policy><allow-access-from domain="" + "*" + "" to-ports="8080"/></cross-domain-policy>