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

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 !" ;
}