利用Flash XMLSocket实现”服务器推”技术
利用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\n";
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+"\n"+ 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>\0";
44:
45: byte[] tmpBytes = Encoding.UTF8.GetBytes(onemessge);
46: newSocket.Send(tmpBytes);
47:
48: Thread newThread = new Thread(new ParameterizedThreadStart(ReadMsg));
49: newThread.IsBackground = true;
50: object obj = newSocket;
51: newThread.Start(obj);
52: }
53: catch (SocketException ex)
54: {
55:
56:
57:
58: }
59: }
60: }
61:
62: static void ReadMsg(object obj)
63: {
64: Socket socket = (Socket)obj;
65:
66: byte[] byteMessage = null; ;
67:
68: while (ServiceStartFlag)
69: {
70: try
71: {
72: if (socket.Connected)
73: {
74:
75: byteMessage = new byte[1000];
76: int len = socket.Receive(byteMessage);
77: if (len > 0)
78: {
79: string sTime = DateTime.Now.ToShortTimeString();
80:
81: string msg = sTime + ":" + "Message from:";
82:
83: msg += socket.RemoteEndPoint.ToString() + Encoding.UTF8.GetString(byteMessage);
84: Console.WriteLine(msg);
85: byteMessage = null;
86:
87: byte[] tmpBytes = Encoding.UTF8.GetBytes("Sended Sucessed!\0");
88:
89: socket.Send(tmpBytes);
90: }
91:
92:
93: }
94: }
95: catch (SocketException ex)
96: {
97: Console.WriteLine(ex.Message);
98: }
99: }
100: }
101: }
102: }
103:
104:
运行结果:
利用Flash XMLSocket实现”服务器推”技术的更多相关文章
- Comet:基于 HTTP 长连接的“服务器推”技术解析
原文链接:http://www.cnblogs.com/deepleo/p/Comet.html 一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示 ...
- Comet:基于 HTTP 长连接的“服务器推”技术
“服务器推”技术的应用 请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档.教程.论坛.blog.wiki 和新闻.任何 Ajax 的新信息都能在这里找到. c ...
- 转载:Comet:基于 HTTP 长连接的“服务器推”技术
转自:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无须客 ...
- [转载] Comet:基于 HTTP 长连接的“服务器推”技术
转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ “服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工 ...
- “服务器推”技术【转载+整理】
原文地址 本文内容 "服务器推(server-push)"技术的应用 基于客户端套接口的"服务器推"技术 基于 HTTP 长连接的"服务器推" ...
- 服务器推技术研究Comet
服务器推技术 最近参与的一个关于股票的项目,有这样一个需求.服务器需要主动推送给客户端消息.这和传统的Web模式不同.传统的Web系统,客户端和服务器的交互是这样的: 客户端先和服务器建立一个TCP连 ...
- Comet:基于 HTTP 长连接的“服务器推”技术(转载)
“服务器推”技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 监控系统:后台硬件热插拔.LED.温度.电压发生变化: 即时通信 ...
- 【转】Comet:基于 HTTP 长连接的“服务器推”技术
原文链接:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 很多应用譬如监控.即时通信.即时报价系统都需要将后台发生的变化实时传送到客户端而无 ...
- HTTP 笔记与总结(9)分块传输、持久链接 与 反向 ajax(comet / server push / 服务器推技术)
反向 ajax 又叫 comet / server push / 服务器推技术 应用范围:网页聊天服务器,例如新浪微博在线聊天.google mail 网页聊天 原理:一般而言,HTTP 协议的特点是 ...
随机推荐
- nginx配置语法
http://baijiahao.baidu.com/s?id=1604485941272024493&wfr=spider&for=pc http://blog.csdn.net/h ...
- Java精选笔记_IO流(字节流、InputStream、OutputStream、字节文件、缓冲区输入输出流)
字节流 操作图片数据就要用到字节流. 字符流使用的是字符数组char[],字节流使用的是字节数组byte[]. 字节流读写文件 针对文件的读写,JDK专门提供了两个类,分别是FileInputStre ...
- ajax异步加载回跳定位
1)首先,问题是这样的:page1在一个滚动到页面底部加载更新的函数(功能),当页面滚动了第二页(或更多页)时,点击链接跳转到了其他页面(page2),在page2有返回按钮,当从page2返回pag ...
- JVM学习(一)
JVM自身的物理结构:
- U3D关于message的使用
Message相关有3条指令: SendMessage ("函数名",参数,SendMessageOptions) //GameObject自身的Script BroadcastM ...
- git 提交代码出现git Permission to Xx denied to Xx 错误
http://blog.csdn.net/chen_xi_hao/article/details/71172279
- surfaceView和View的区别
概念:view在UI线程去更新自己:而SurfaceView则在一个子线程中去更新自己 surfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面 在UI的 ...
- 安装Hadoop系列 — 安装SSH免密码登录
配置ssh免密码登录 1) 验证是否安装ssh:ssh -version显示如下的话则成功安装了OpenSSH_6.2p2 Ubuntu-6ubuntu0.1, OpenSSL 1.0.1e 11 ...
- go练习2-go的学习资料
好吧 我承认,有自己添加的内容也有从别人的blog 中 ctrl + c 的 官方:http://golang.org ,经常被封 中文手册的翻译:http://code.google.com/p/g ...
- 【Android】Android软件开发之ListView 详解
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://xys289187120.blog.51cto.com/3361352/65717 ...