(二)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(服务器地址,端口号) :尝试联接远程计算机
示例:
其中,connect 方法有两个参数,第一个参数表示要连接的主机,可以是全限定的域名和者 IP 地址,需要注意一点:当使用 IP 地址时,如 127.0.0.1 需要把它当作字符串来处理,即要用引号把 IP 地址括起来.如果为 null,则连接 Web 服务器 (从该 Web 服务器下载了包含当前 Flash 应用的网页) 所在的 IP 地址.
if (!mySocket.connect(null, 2000))
{
myTextField.text = "连接失败!";
}
第二个参数表示要连接的端口,由于低于 1024 的端口被通用程序所占,Flash 的安全规则不允许在低于 1024 的端口建立连接.connect 方法返回布尔型变量 true 或 false,表示连接是否成功.
以上语句中,如果连接失败,connect 方法返回 flase,则把 myTextField(为一非静态文字 TextField 对象的实例)的内容设为 "连接失败!".
②. send(信息内容):在和远程计算机建立联接后,发送信息到远程计算机
示例:mySocket.send("");
其中,参数可以是一个 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 的三个事件处理函数,其中,myOnConnect,myOnXML 分别是带有一个参数的函数,myOnClose 不带参数,当发生相应的事件时,就调用相应的处理函数.
mySocket.onConnect = myOnConnect;
mySocket.onXML = myOnXML;
mySocket.onClose = myOnClose;
function myOnConnect (bool) {
......// 连接尝试完毕后触发,参数为 bool 值,表示是否连接成功
}
function myOnXML(doc) {
......// 有接收到数据时触发,数据参数 doc 为接手到的从服务器端传来的 xml 对象,我们可以在该函数里解析出我们需要的数据,并做相应动作
}
function myOnClose() {
......// 连接关闭时触发,可以作一些后期的工作,比如在 UI 上提示用户
}
(3) 使用 XMLSocket 对象的 connect 方法,建立与服务端的连接 mySocket.connect(null, 2000);
以上语句中,如果连接失败,connect 方法返回 flase.
if (!mySocket.connect(null, 2000)) {
......// 连接失败的处理
}
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("");
(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 的安全规则就不允许建立连接.
来源: http://www.jianshu.com/p/02a33f8a4118