利用flash与.net下socket通信实现WEB页面的“推”(二)Flash和服务器间的通信核心:XMLSocket对象

原创 2004年09月25日 17:07:00

(二)Flash和服务器间的通信核心:XMLSocket对象

    这一部分和下一部分都将以Flash为主,在这一部分我们来看看Flash是如何和服务器端进行通信(主要是客户端通过Flash如何发如何发送信息到服务器端[远程计算机],以及如何接收服务器端[远程计算机]发来的信息,至于服务器端的socket如何处理部分将在后面专门讲到),下一部分是Flash和WEB页面的通信,在阅读这两部分前最好对Flash里的ActionScript(和javascript非常相似)有基本的了解。

1、XMLSocket对象简介
  在概述里,已经提到过了Flash里的XMLSocket对象,它是实现Falsh和服务器Socket间通信的核心。它允许包含Flash应用的浏览器与服务端建立socket连接,之后Flash应用与服务端就可以相互发送XML数据,而且在一个socket连接建立之后,在该连接上传送的数据量是没有限制的,直到socket连接关闭。XMLSocket对象一个最大的好处是以XML格式来封装你的数据,这样在服务器端或flash里你可以很轻松的处理各种复杂的数据。
  XMLSocket对象只有3种方法和4种事件:

(1).XMLSocket的方法:

①. connect(服务器地址,端口号) :尝试联接远程计算机
示例:
if (!mySocket.connect(null, 2000))
{
   myTextField.text = "连接失败!";
}
  其中,connect方法有两个参数,第一个参数表示要连接的主机,可以是全限定的域名和者IP地址,需要注意一点:当使用IP地址时,如 127.0.0.1 需要把它当作字符串来处理,即要用引号把IP地址括起来。如果为null,则连接Web服务器(从该Web服务器下载了包含当前Flash应用的网页)所在的IP地址。
  第二个参数表示要连接的端口,由于低于1024的端口被通用程序所占,Flash的安全规则不允许在低于1024的端口建立连接。connect方法返回布尔型变量true或false,表示连接是否成功。
  以上语句中,如果连接失败,connect方法返回flase,则把myTextField(为一非静态文字TextField对象的实例)的内容设为“连接失败!”。

②. send(信息内容):在和远程计算机建立联接后,发送信息到远程计算机
示例:mySocket.send("<login username ='possible' password = '123' />");
  其中,参数可以是一个XML字符串,也可以是一个xml对象,如果是xml对象,send方法会先将对象转化为字符串,然后将该字符串发送到服务端,并在字符串发送后,追加发送一个0字节。send方法没有返回值。

③.close():关闭和远程计算机之间的联结
示例:mySocket.close();

(2).XMLSocket的事件:

①.onConnect(联机结果)
  当connect()联机方法执行完毕后,它会触发并且传入一个代表联机是否成功的参数给onConnect()事件,如果联机成功,其值将是true。

②.onData()
  当XMLSocket接收到远程计算机传入的资料时,就会触发onData()事件。它和下面讲的onXML()事件的不同之处在于从onData()事件取得的资料是尚未经过flash解析的原始字符串,而从onXML()事件取得的是经过解析后的XML资料。因为不同XMLSocket对象之间的往来信息都是XML格式,因此onXML()事件比较常用。

③.onXML()
  当XMLSocket接收到远程计算机传入的xml资料时,就会触发onXML()事件。
  在onXML事件中,使用onData事件中得到的数据生成一个XML对象,并把该对象作为参数传给onXML事件的处理函数,所以如果要自定义onXML事件的处理函数,服务端发送来的数据就必须是XML格式,否则就会发生意想不到的错误。如果设置了onData事件的处理函数,当数据到达时,将不再调用onXML事件的处理函数,除非再显式地调用,所以在某种意义上,两种事件是互斥的。

④.onClose()
  当远程端计算机中断连接时,这个事件会被触发。

2、使用XMLSocket 对象的流程为:

(1 )建立一个XMLSocket 对象

mySocket = new XMLSocket();

(2) 对生成的XMLSocket 对象进行设置

mySocket.onConnect = myOnConnect;
mySocket.onXML = myOnXML;
mySocket.onClose = myOnClose;

function myOnConnect (bool) {
……//连接尝试完毕后触发,参数为bool值,表示是否连接成功
}
function myOnXML(doc) {
……//有接收到数据时触发,数据参数doc为接手到的从服务器端传来的xml对象,我们可以在该函数里解析出我们需要的数据,并做相应动作
}
function myOnClose() {
……//连接关闭时触发,可以作一些后期的工作,比如在UI上提示用户
}

  前三条语句,分别设置了mySocket的三个事件处理函数,其中,myOnConnect、myOnXML分别是带有一个参数的函数,myOnClose不带参数,当发生相应的事件时,就调用相应的处理函数。

(3) 使用XMLSocket 对象的connect方法,建立与服务端的连接mySocket.connect(null, 2000);

if (!mySocket.connect(null, 2000)) {
……//连接失败的处理
}

  以上语句中,如果连接失败,connect方法返回flase。
  XMLSocket对象与远端计算机进行连接将触发onConnect事件,则相应的事件处理函数(见上面流程步骤2中的设置)myOnConnect,其中的参数与connect方法的返回值意义相同。

(4) 当连接建立成功之后,客户端与服务端就可以相互发送XML数据了。使用XMLSocket 对象的send方法向服务端发送数据:

var myXML = new XML();
var myLogin = myXML.createElement("login");

myLogin.attributes.username = "possible";
myLogin.attributes.password = "mvpcn";
myXML.appendChild(myLogin);

mySocket.send(myXML);

也可以直接这样:

mySocket.send("<login username = "possible" password = "mvpcn" />");

  
(5) 最后,在程序结束的时侯,使用XMLSocket 对象的close方法,关闭Socket连接,如下:

mySocket.close();

  需要注意的是,使用XMLSocket 对象的close方法,来关闭Socket连接不触发XMLSocket对象的onClose事件,只有当Socket连接被服务端关闭时,才在Flash应用客户端触发该事件。

3、使用XMLSocket 对象时必须要注意两点:

(1)、在socket连接上发送的XML数据,每条数据以一个0字节隔开,因为XMLSocket的send方法在字符串发送后,追加发送一个0字节。
(2)、Flash 应用所连接的主机必须是与相应Web服务器在同一IP地址或是同一子域。所谓同一子域是指在同一域名空间中,例如包含Flash应用的网页是从blog.mvpcn.com下载的,则possible.blog.mvpcn.net就是子域,就允许建立连接,而mvpcn.net不是子域,Flash的安全规则就不允许建立连接。

flash与c++进行Socket进行简单通信

一、简介       用flash去开发应用,,免不了网络通讯,特别是网络游戏,需要用到即使通讯。 as3提供了两个支持即时通讯的类:XMLSocket和Socket,       前者其实是只支持发...
  • u010150082
  • u010150082
  • 2013年10月29日 17:07
  • 1697

浅谈Flash Socket通信安全沙箱

用过Flash socket的同学都知道,Flash socket通讯有安全沙箱问题。就是在Flash Player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无...
  • cwqcwk1
  • cwqcwk1
  • 2014年04月29日 23:18
  • 2791

flash socket 从头开始构建一个web即时通讯系统 - 客户端

flash中的socket   socket的构造 实例化一个socket对象,只需要一行代码: static var socket = new flash.net.Socket();   ...
  • MeetLunay
  • MeetLunay
  • 2013年05月24日 12:48
  • 2318

Socket实现进程间通信

概述Socket也称为“套接字”,是网络通信中的概念,它分为流式套接字和用户数举报套接字两种,分别对应于网络的传输控制层中的TCP和UDP协议。TCP协议是面向连接的协议,提供稳定的双向爱那个通信功能...
  • Small_Lee
  • Small_Lee
  • 2016年06月17日 16:39
  • 1509

实现了本机两个进程之间的通信 c#.net socket

在没学c# .net socket编程之前。感觉实现这个好难,一点眉目都没有。 但是,真的下决心去学以后。看一看基础,看一看前人的思路,实际的例子。稍稍用点心,体会体会,自己写几遍,就掌握了。然后,觉...
  • CGGUANG
  • CGGUANG
  • 2016年12月14日 06:13
  • 1914

flex与socket通信之成功----之成功补充篇(关于C#建立FLASH服务端的安全沙箱问题)

注意:XMLSocket 接收到服务端下发的数据时,将连续放于接收缓冲区,直到接收到 "\0" 字节(字节内容为 ASCII 值 0),才认为接收完成,并调用相应的 onData 或 onXML ...
  • shileimohan
  • shileimohan
  • 2015年03月28日 18:01
  • 1098

Linux进程间通信——使用流套接字

前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程。通常我们使用socket进行网络编...
  • ljianhui
  • ljianhui
  • 2013年08月29日 00:18
  • 19757

Linux进程间通信方式--本地socket

先上一个代码 服务端: [cpp] view plain copy   //s_unix.c   #include    #include ...
  • brandon2015
  • brandon2015
  • 2016年04月04日 15:24
  • 406

UDP通信写FLASH前必须先擦除

Linux下不能向255.255.255.255发送udp广播 2013-12-18 15:37:47 分类: LINUX 转自:http://www.linuxidc.com/Linux/201...
  • ZHUJLFINE
  • ZHUJLFINE
  • 2014年09月09日 21:44
  • 175

Android 使用Socket完成进程间通信

看一些Android应用,特别是涉及到底层的功能性的应用,比如游戏加速,修改内存,挂机脚本神马的,发现里面的通信机制无一例外的都是使用的socket,基本上已经成为这类应用的一种标配了。 因为这类应...
  • jia635
  • jia635
  • 2014年08月06日 23:15
  • 1110
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用flash与.net下socket通信实现WEB页面的“推”(二)Flash和服务器间的通信核心:XMLSocket对象
举报原因:
原因补充:

(最多只允许输入30个字)