科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件flash中通过XMLSocket监控生产系统-2

flash中通过XMLSocket监控生产系统-2

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 通过使用该对象实例的方法与属性,可以加载、解析、发送、构造、和维护XML文档树。

作者: 来源:中国软件网 2008年6月19日

关键字: 监控 FLASH XML 软件

  • 评论
  • 分享微博
  • 分享邮件

二、技术介绍

1、XML 对象

  通过使用该对象实例的方法与属性,可以加载、解析、发送、构造、和维护XML文档树。
令人激动的是,在Flash的最新版本Flash MX中,XML 对象已经成为一个本地对象,即在FlashPlayer 6中内置对其的直接支持(Flash Player 5只有300多KB,而Flash Player 6却有800 KB,内置许多对象是相当大的原因。),因此,动态性能得到了极大的提高。

  在使用XML 对象之前,必须通过其构造函数,生成一个对象实例,然后通过使用其方法和属性,对XML文档树进行操作。XML 对象有两种构造函数:

1) new XML(src)

  其中参数src 必须是格式正确的XML文本,以下语句先通过传进来的XML文本生成一个XML对象实例,将把两个非静态文字(TextField对象)实例nameTextField和passwordTextField的内容分别设为“Morgan”和“loveme”如:

myXML = new XML(””);
nameTextField.text = myLogin.attributes.username ;
passwordTextField.text = myLogin.attributes.password ;

2) new XML()

  生成一个空的XML对象实例,然后调用其相应的方法如load()、createElement()、 createTextNode()、cloneNode()、appendChild()等方法构造或加载XML文挡树,具体的用法可以参考Flash在线帮助,由于本文的重点在于使用Flash的socket(套接字)连接,所以关于XML对象的基于HTTP协议的send()、load()、sendAndLoad()等方法就不做介绍,对于如何构造XML文挡树请参见下文。

关键字:flash、XML、XMLSocket、TextField、Web方式、及时监控

二、技术介绍

2、XMLSocket 对象

  实现了客户端socket(套接字),允许包含Flash应用的浏览器与服务端建立socket连接,之后Flash应用与服务端就可以相互发送XML数据,而且在一个socket连接建立之后,在该连接上传送的数据量是没有限制的,直到socket连接关闭。

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

o 在socket连接上发送的XML数据,每条数据以一个0字节隔开,详见下面服务端的建立。
o Flash 应用所连接的主机必须是与相应Web服务器在同一IP地址或是同一子域。所谓同一子域是指在同一域名空间中,例如包含Flash应用的网页是从mail.real-ok.com下载的,则name.mail.real-ok.com就是子域,就允许建立连接,而real-ok.com不是子域,Flash的安全规则就不允许建立连接。

使用XMLSocket 对象的流程为:

1) 建立一个XMLSocket 对象

mySocket = new XMLSocket();

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

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

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

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

  其中,connect方法有两个参数,第一个参数表示要连接的主机,可以是全限定的域名和者IP地址,需要注意一点:当使用IP地址时,如 127.0.0.1 需要把它当作字符串来处理,即要用引号把IP地址括起来。如果为null,则连接Web服务器(从该Web服务器下载了包含当前Flash应用的网页)所在的IP地址。

  第二个参数表示要连接的端口,由于低于1024的端口被通用程序所占,Flash的安全规则不允许在低于1024的端口建立连接。connect方法返回布尔型变量true或false,表示连接是否成功。如:

if (!mySocket.connect(null, 2000)) {
myTextField.text = “连接失败!”;
}

  以上语句中,如果连接失败,connect方法返回flase,则把myTextField(为一非静态文字TextField对象的实例)的内容设为“连接失败!”。

  XMLSocket对象与服务端进行连接将触发onConnect事件,则相应的事件处理函数(见上面流程步骤2中的设置)myOnConnect,其中的参数与connect方法的返回值意义相同,详见下面的客户端实例。

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

mySocket.send(myXML);

  其中,myXML是一个包含XML数据的XML对象,send方法先把myXML转化为字符串,然后将该字符串发送到服务端,并在字符串发送后,追加发送一个0字节。send方法没有返回值。

  以下示例中,先生成一个空的XML对象myXML,然后在myXML中添加了一个元素节点myLogin,该节点包含两个属性username和password,send方法把myXML转化成字符串 后,发送给服务端,当然还要追加发送一个0字节,以表示一条XML数据的完成:

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

myLogin.attributes.username = "morgan";
myLogin.attributes.password = "loveme";
myXML.appendChild(myLogin);

mySocket.send(myXML);

  当有数据到达(收到一条以0字节为结尾的字符串)时,首先将触发onData事件,相应的事件处理函数myOnData带有一个参数,表示当时到达的数据字符串,但不包含0字节,如下例中,服务端传来一个字符串 “I am Morgan Yang !”,加上一个0字节,以下语句将把myTextField(为一非静态文字TextField对象的实例)的内容设为“I am Morgan Yang !”,我们注意到这里发送的数据,可以是包括XML格式在内的任何形式:

function myOnData(src) {
myTextField.text = src ;
}

对于onData事件,如果没有相应的事件处理函数,默认将触发onXML事件,形式如下:

XMLSocket.prototype.onData = function (src) {
this.onXML(new XML(src));
}

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

  在没设置onData事件处理函数,又设置了onXML事件处理函数情况下,当有XML数据 到达时,以下语句将把两个非静态文字实例nameTextField和passwordTextField的内容分别设为“Morgan”和“loveme”:

function myOnXML(doc) {

var e = doc.firstChild;

if (e != null && e.nodeName == " login ") {

nameTextField.text = e.attributes.username ;
passwordTextField.text = e.attributes.password ;
}
}

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

mySocket.close();

  需要注意的是,使用XMLSocket 对象的close方法,来关闭Socket连接不触发XMLSocket对象的onClose事件,只有当Socket连接被服务端关闭时,才在Flash应用客户端触发该事件,默认情况下,XMLSocket 对象的onClose事件处理函数不执行任何动作,可以自定义该事件处理函数,以达到特定目的。如以下语句,在onClose事件发生时,把myTextField(为一非静态文字实例)的内容设为 “Socket Closed By Server !”

function myOnClose() {
myTextField .text = "Socket Closed By Server !" ;
}

[下一页]

关键字:flash、XML、XMLSocket、TextField、Web方式、及时监控

二、技术介绍

3、TextField文本域对象

  在介绍TextField对象之前,首先我们须明白,在Flash中,有三种文本:

1) 静态文本(Static Text)

  内容和样式都在创作是决定,在Flash MX中,可以有竖直的静态文本,在Flash属性检查器中设置(关于静态文本的详细阐述,请参见作者的另一篇文章“Flash Text”)。

2) 动态文本(Dynamic Text)

  是TextField对象的一个实例,可以在Flash属性检查器中为其设置唯一的实例名,然后就可以使用该实例名来使用相应的方法与属性以改变动态文本的内容与样式。

  本文所介绍的使用XMLSocket以Web方式对生产系统进行及时监控的应用案例中,就是使用动态文本以不同的颜色来显示服务端发送过来的不同信息:

function myOnXML(doc) {

var e = doc.firstChild;

Selection.setFocus("_root.txt");
Selection.setSelection(0,0);

if (e != null && e.nodeName == "MESSAGE") {

if(e.attributes.type == "error"){

myTextFormat.color = "0xff0000";
txt.setNewTextFormat(myTextFormat);
txt.replaceSel("Error -- " + e.attributes.text + " -- "
+ e.attributes.time + newline);

}else if (e.attributes.type == "normal"){

myTextFormat.color = "0x0000ff";
txt.setNewTextFormat(myTextFormat);
txt.replaceSel("Normal-- " + e.attributes.text + " -- "
+ e.attributes.time + newline);
}
}
}

  以上语句是XMLSocket对象的onXML事件处理函数的部分,函数中第一条语句得到XML文档的第一个节点,假设服务端发送来的数据为
  接着的一个嵌套if语句,判断变量 e 所代表的节点的类型,如果是"error"类型,就通过myTextFormat(TextFormat文本样式对象的一个实例),把该条信息显示成红色;如果是"error"类型,就通过myTextFormat,把该条信息显示成蓝色;在实际场合下,可以根据需要,定义任意条信息类型。

  其中的变量 txt 就表示一个动态文本对象,每次收到数据时,就调用TextField对象的 replaceSel() 方法把相应的数据插入到文本框的最顶行。为什么是最顶行呢?这就是 Selection.setSelection(0,0) 语句的作用,它把光标位置定位到第一行的第一个位置。其中,newline是Flash中的常量,表示换行。

3) 输入域文本(Input Text)

  和动态文本一样,它也是TextField对象的一个实例,可以在Flash属性检查器中为其设置唯一的实例名,然后就可以使用该实例名来使用相应的方法与属性以改变动态文本的内容与样式,与动态文本的是,它允许用户输入,并且具有剪切、复制、粘贴、全选等编辑功能。

  本文所介绍的应用案例中,就是使用输入框文本来让用户输入建立Socket 所要连接的主机与端口:

function btnConnect_onClick() {

if(txtPort.text < 1024 || txtPort.text > 65536){

txtPort.text = "";
Selection.setFocus("_root.txtPort");
txtPort.backgroundColor = "0xFF0000";
}else{

if(txtHost.text == “Default Host”){

socket.connect(null, txtPort.text);
}else{

socket.connect(txtHost.text, txtPort.text);
}
}
}

  以上语句是btnConnect按钮(应用程序开发组件PushButton的一个实例)的单击事件处理函数,其中函数名设为btnConnect_onClick,只是为了便于理解,只要在属性检查器中设置btnConnect的Click Handler(单击事件处理器)到相应的函数。txtHost和txtPort 分别让用户输入连接主机与端口的输入域(TextField)对象。

  当用户单击btnConnect按钮时,首先判断用户输入的端口数是否在1024与65565之间,如果不在,把端口输入框txtPort的内容请空,背景变成红色,并用以下语句得到输入焦点 Selection.setFocus("_root.txtPort") ,让用户重新输入。由于txtPort端口输入框的内容必须是数字,所以可以设定用户只能输入数字,同时,当用户再次输入时,把端口输入框的背景变成原来的颜色:

txtPort.restrict = "0-9";
txtPort.onChanged = txtPort_onChanged;

  在生成输入框文本时,默认txtHost的内容是”Default Host” ,如果用户在连接前没有改变,则连接Web服务器所在的IP地址,如果用户输入了主机,得保证所连接的主机与Web服务器在同一IP地址或同一子域。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章