明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

flash中通過XMLSocket監(jiān)控生產(chǎn)系統(tǒng)(2-3)

[摘要]4) 當連接建立成功之后,客戶端與服務(wù)端就可以相互發(fā)送XML數(shù)據(jù)了。使用XMLSocket 對象的send方法向服務(wù)端發(fā)送數(shù)據(jù): mySocket.send(myXML);  其中,myXML是一個包含XML數(shù)據(jù)的XML對象,send方法先把myXML轉(zhuǎn)化為字符串,然后將該字符串發(fā)送到服務(wù)端,并在...
4) 當連接建立成功之后,客戶端與服務(wù)端就可以相互發(fā)送XML數(shù)據(jù)了。使用XMLSocket 對象的send方法向服務(wù)端發(fā)送數(shù)據(jù):

mySocket.send(myXML);

  其中,myXML是一個包含XML數(shù)據(jù)的XML對象,send方法先把myXML轉(zhuǎn)化為字符串,然后將該字符串發(fā)送到服務(wù)端,并在字符串發(fā)送后,追加發(fā)送一個0字節(jié)。send方法沒有返回值。

  以下示例中,先生成一個空的XML對象myXML,然后在myXML中添加了一個元素節(jié)點myLogin,該節(jié)點包含兩個屬性username和password,send方法把myXML轉(zhuǎn)化成字符串 后,發(fā)送給服務(wù)端,當然還要追加發(fā)送一個0字節(jié),以表示一條XML數(shù)據(jù)的完成:

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

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

mySocket.send(myXML);


  當有數(shù)據(jù)到達(收到一條以0字節(jié)為結(jié)尾的字符串)時,首先將觸發(fā)onData事件,相應的事件處理函數(shù)myOnData帶有一個參數(shù),表示當時到達的數(shù)據(jù)字符串,但不包含0字節(jié),如下例中,服務(wù)端傳來一個字符串 “I am Morgan Yang !”,加上一個0字節(jié),以下語句將把myTextField(為一非靜態(tài)文字TextField對象的實例)的內(nèi)容設(shè)為“I am Morgan Yang !”,我們注意到這里發(fā)送的數(shù)據(jù),可以是包括XML格式在內(nèi)的任何形式:

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


對于onData事件,如果沒有相應的事件處理函數(shù),默認將觸發(fā)onXML事件,形式如下:

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


  即在onXML事件中,使用onData事件中得到的數(shù)據(jù)生成一個XML對象,并把該對象作為參數(shù)傳給onXML事件的處理函數(shù),所以如果要自定義onXML事件的處理函數(shù),服務(wù)端發(fā)送來的數(shù)據(jù)就必須是XML格式,否則就會發(fā)生意想不到的錯誤。如果設(shè)置了onData事件的處理函數(shù),當數(shù)據(jù)到達時,將不再調(diào)用onXML事件的處理函數(shù),除非在顯式地調(diào)用,所以在某種意義上,兩種事件是互斥的。

  在沒設(shè)置onData事件處理函數(shù),又設(shè)置了onXML事件處理函數(shù)情況下,當有XML數(shù)據(jù) 到達時,以下語句將把兩個非靜態(tài)文字實例nameTextField和passwordTextField的內(nèi)容分別設(shè)為“Morgan”和“l(fā)oveme”:

function myOnXML(doc) {

var e = doc.firstChild;

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

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


5) 最后,在程序結(jié)束的時侯,使用XMLSocket 對象的close方法,關(guān)閉Socket連接,如下:

mySocket.close();

  需要注意的是,使用XMLSocket 對象的close方法,來關(guān)閉Socket連接不觸發(fā)XMLSocket對象的onClose事件,只有當Socket連接被服務(wù)端關(guān)閉時,才在Flash應用客戶端觸發(fā)該事件,默認情況下,XMLSocket 對象的onClose事件處理函數(shù)不執(zhí)行任何動作,可以自定義該事件處理函數(shù),以達到特定目的。如以下語句,在onClose事件發(fā)生時,把myTextField(為一非靜態(tài)文字實例)的內(nèi)容設(shè)為 “Socket Closed By Server !”

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