利用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 协议的特点是 ...
随机推荐
- centos6.5 开发环境部署(nignx1.7.10+php5.4.38+mysql+ftp)
一些命令和规则以及准备 本次流程再 DigitalOcean上的vps上通过 查看是否已经安装 rpm -qa | grep nginx 删除安装 #普通删除模式 rpm -e nginx #强力删除 ...
- [extjs] ExtJS 4.2 开发环境搭建
到官网下载Extjs ,现在最新版的是Ext5.1. 这里用ext4.2演示开发.http://extjs.org.cn/. EXT4.1 在线API 项目结构中ext4.2导入的资源文件: 第一个页 ...
- socket小实例
服务端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- python2.0_day18_django_ORM
Django_ORMday15\16我们学到的ORM都是最基本的增删改查.下面我们稍作升级,学习下高级点的增删改查.先创建一个新的APP项目 python3. manage.py startapp b ...
- python2.0_s12_day10_rabbitMQ使用介绍
RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(M ...
- 第四篇:GPU 并行编程的存储系统架构
前言 在用 CUDA 对 GPU 进行并行编程的过程中,除了需要对线程架构要有深刻的认识外,也需要对存储系统架构有深入的了解. 这两个部分是 GPU 编程中最为基础,也是最为重要的部分,需要花时间去理 ...
- 关于KEIL仿真的虚拟串口讲解
这个是最后的效果图,右下方是串口打印的设置 第一步:在程序上写入关于串口一的配置,以及初始化和串口输出的内容 第二步:需要的时候在进行配置,在OPTIONS OF TARGET一栏的c/c++中(其原 ...
- 进程防结束之PS_CROSS_THREAD_FLAGS_SYSTEM
有人投到黑防去了,不过黑防不厚道,竟然没给完整的代码,自己整理一份备用吧,驱网.DebugMan.邪八的那群人直接飘过吧. 这种方法的关键在于给线程的ETHREAD.CrossThreadFlags设 ...
- openstack的glance、nova、cinder使用ceph做后端存储
块设备与 OPENSTACK 通过 libvirt 你可以把 Ceph 块设备用于 OpenStack ,它配置了 QEMU 到 librbd 的接口. Ceph 把块设备映像条带化为对象并分布到集群 ...
- poj_1084 剪枝-IDA*
题目大意 给出一个由2*S*(S+1)构成的S*S大小的火柴格.火柴可以构成1x1,2x2...SxS大小的方格.其中已经拿走了几个火柴,问最少再拿走几个火柴可以使得这些火柴无法构成任何一个方格. 题 ...