[AS 3]Flashとバックグラウンドデータ交換の4つの方法の整理

63561 ワード


Flash Player 9の普及に伴い、AS 3のプログラミングも多くなってきたので、今回はAS 3のバックグラウンドとのデータ交換方法をいくつか再整理します.1.URLLoader(URLStream)2.FlashRemoting3.XMLSocket(Socket) 4.FMS/FCS
一、URLLoader(URLStream)篇URLStreamとURLLoader中のURLLoaderDataFormat.BINARYは似ていて、それはダウンロードURLに対する低級なアクセス方式を提供して、私はここで二度と繰り返しません.興味があるのは、FlashヘルプのURLStreamクラスを見ることができます.Flashエンド
  1 view plaincopy to clipboardprint?

  2 /**   

  3 * @author Kinglong   

  4 * @link http://www.klstudio.com   

  5 * @mail [email protected]   

  6 * @version 0.1   

  7 */   

  8    

  9 package project.test {    

 10    

 11         

 12     import flash.display.*;    

 13     import flash.events.*;    

 14     import flash.net.*;     

 15    

 16     public class TestURLLoader extends Sprite {    

 17         private var _loader:URLLoader;    

 18         public function TestURLLoader() {    

 19             //  URLLoader  ;    

 20             _loader = new URLLoader();    

 21             //        (  、       、URL     );    

 22             _loader.dataFormat = URLLoaderDataFormat.VARIABLES;    

 23                 

 24             //           

 25             configureListeners(_loader);    

 26                 

 27             //      ;    

 28             var params:URLVariables = new URLVariables();    

 29             params.username = "kinglong";    

 30             params.password = "king";    

 31                 

 32             //  Request    ;    

 33             var request:URLRequest = new URLRequest("http://www.klstudio.com/none.jsp");    

 34             //    ;    

 35             request.data = params;              

 36             //      (POST,GET);    

 37             request.method = URLRequestMethod.POST;             

 38                 

 39             try {    

 40                 loader.load(request);    

 41             } catch (error:Error) {    

 42                 trace(error);    

 43             }    

 44    

 45                 

 46         }    

 47         private function configureListeners(dispatcher:IEventDispatcher):void {    

 48             //      ;    

 49             dispatcher.addEventListener(Event.COMPLETE, loaderHandler);    

 50             //      ;    

 51             dispatcher.addEventListener(Event.OPEN, loaderHandler);    

 52             //      ;    

 53             dispatcher.addEventListener(ProgressEvent.PROGRESS, loaderHandler);    

 54             //          ;    

 55             dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loaderHandler);    

 56             //Http    ;    

 57             dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, loaderHandler);    

 58             //      ;    

 59             dispatcher.addEventListener(IOErrorEvent.IO_ERROR, loaderHandler);    

 60         }    

 61             

 62         private function loaderHandler(event:*):void {    

 63             switch(event.type) {    

 64                 case Event.COMPLETE:    

 65                     trace(_loader.data.result);    

 66                     break;    

 67                 case Event.OPEN:    

 68                     trace("open: " + event);    

 69                     break;    

 70                 case ProgressEvent.PROGRESS:    

 71                     trace("progress: " + event);    

 72                     break;    

 73                 case SecurityErrorEvent.SECURITY_ERROR:    

 74                     trace("securityError: " + event);    

 75                     break;    

 76                 case HTTPStatusEvent.HTTP_STATUS:    

 77                     trace("httpStatus: " + event);    

 78                     break;    

 79                 case IOErrorEvent.IO_ERROR:    

 80                     trace("ioError: " + event);    

 81                     break;    

 82                     

 83             }    

 84         }          

 85    

 86     }       

 87 }   

 88 /**

 89 * @author Kinglong

 90 * @link http://www.klstudio.com

 91 * @mail [email protected]

 92 * @version 0.1

 93 */

 94 

 95 package project.test {

 96 

 97  

 98  import flash.display.*;

 99  import flash.events.*;

100  import flash.net.*;

101 

102  public class TestURLLoader extends Sprite {

103   private var _loader:URLLoader;

104   public function TestURLLoader() {

105    //  URLLoader  ;

106    _loader = new URLLoader();

107    //        (  、       、URL     );

108    _loader.dataFormat = URLLoaderDataFormat.VARIABLES;

109    

110    //       

111    configureListeners(_loader);

112    

113    //      ;

114    var params:URLVariables = new URLVariables();

115    params.username = "kinglong";

116    params.password = "king";

117    

118    //  Request    ;

119    var request:URLRequest = new URLRequest("http://www.klstudio.com/none.jsp");

120    //    ;

121    request.data = params;   

122    //      (POST,GET);

123    request.method = URLRequestMethod.POST;   

124    

125             try {

126                 loader.load(request);

127             } catch (error:Error) {

128                 trace(error);

129             }

130 

131    

132   }

133   private function configureListeners(dispatcher:IEventDispatcher):void {

134    //      ;

135             dispatcher.addEventListener(Event.COMPLETE, loaderHandler);

136    //      ;

137             dispatcher.addEventListener(Event.OPEN, loaderHandler);

138    //      ;

139             dispatcher.addEventListener(ProgressEvent.PROGRESS, loaderHandler);

140    //          ;

141             dispatcher.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loaderHandler);

142    //Http    ;

143             dispatcher.addEventListener(HTTPStatusEvent.HTTP_STATUS, loaderHandler);

144    //      ;

145             dispatcher.addEventListener(IOErrorEvent.IO_ERROR, loaderHandler);

146         }

147   

148   private function loaderHandler(event:*):void {

149    switch(event.type) {

150     case Event.COMPLETE:

151      trace(_loader.data.result);

152      break;

153     case Event.OPEN:

154      trace("open: " + event);

155      break;

156     case ProgressEvent.PROGRESS:

157      trace("progress: " + event);

158      break;

159     case SecurityErrorEvent.SECURITY_ERROR:

160      trace("securityError: " + event);

161      break;

162     case HTTPStatusEvent.HTTP_STATUS:

163      trace("httpStatus: " + event);

164      break;

165     case IOErrorEvent.IO_ERROR:

166      trace("ioError: " + event);

167      break;

168     

169    }

170   }     

171 

172  } 

173 } 

サービス側(jsp)
view plaincopy to clipboardprint?

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>   

<%    

String username = request.getParameter("username");    

String password = request.getParameter("password");    

boolean result = false;    

//    ...;    

out.println("result="+result+"&_");    

%>  

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>

<%

String username = request.getParameter("username");

String password = request.getParameter("password");

boolean result = false;

//    ...;

out.println("result="+result+"&_");

%>

 

 
利点:1、flashコードは実現が簡単で、便利です.2、サービス側の受信ページは1つのフォームからのデータを受信するのと同じように処理し、専門的な技術を必要とせず、すべてのサービス側のプログラムを実現することができる. 3、文字列変数を送信してもよいし、ファイルストリーム([AS 3]URLLoader+URLRequest+JPGEncoderでBitmapDataピクチャデータ保存を実現)を送信してもよい.4、AMF 3と組み合わせてより豊富なデータ型を受信することができる([AS 3]AMF 3+JAVAの呼び出し例).欠点:1、伝達する変数は多すぎるべきではありません.2、変数伝達の値は長すぎるべきではない.注意:受信データ型がURLLoaderDataFormat.VARIABLESに設定されている場合、最初の文字は&で始まることはできません.最後の部分は&終わりにしたほうがいいです.
 
二、FlashRemoting編はAS版FlashRemotingに比べて、クライアントコードが簡単になり、伝達されたデータが豊富になった.
   

RemotingService 



view plaincopy to clipboardprint?

/**   

* @author Kinglong   

* @link http://www.klstudio.com   

* @mail [email protected]   

* @version 0.1   

*/   

package com.klstudio.remoting{    

    import flash.net.NetConnection;    

    import flash.net.ObjectEncoding;    

    public class RemotingService extends NetConnection{    

        function RemotingService(url:String,amf:uint=ObjectEncoding.AMF0){    

            this.objectEncoding = amf;    

            this.connect(url);    

        }    

    }    

}  

/**

* @author Kinglong

* @link http://www.klstudio.com

* @mail [email protected]

* @version 0.1

*/

package com.klstudio.remoting{

 import flash.net.NetConnection;

 import flash.net.ObjectEncoding;

 public class RemotingService extends NetConnection{

  function RemotingService(url:String,amf:uint=ObjectEncoding.AMF0){

   this.objectEncoding = amf;

   this.connect(url);

  }

 }

} 

TestFlashRemoting 



view plaincopy to clipboardprint?

/**   

* @author Kinglong   

* @link http://www.klstudio.com   

* @mail [email protected]   

* @version 0.1   

*/   

   

package project.test {    

   

        

    import flash.display.*;    

    import flash.events.*;    

    import flash.net.*;     

        

    import com.klstudio.remoting.RemotingService;    

   

    public class TestFlashRemoting extends Sprite {    

        private var _service:RemotingService;    

        public function TestFlashRemoting() {    

                

            //        

            _service = new RemotingService("http://localhost:8500/flashservices/gateway");    

                

            //  FlashRemoting      

            /*   

             * RemotingService.call([   ],[    ],[    ]...);   

             */   

            _service.call("myservice.getString",new Responder(onResult, onFault),"kinglong");    

        }    

            

            

        //

        private function onResult(result:Object):void {    

            trace("result:"+result);    

        }    

        //          

        private function onFault(fault:Object):void {    

            trace("fault:"+fault.details);    

        }    

    }       

}   

/**

* @author Kinglong

* @link http://www.klstudio.com

* @mail [email protected]

* @version 0.1

*/



package project.test {



 

 import flash.display.*;

 import flash.events.*;

 import flash.net.*; 

 

 import com.klstudio.remoting.RemotingService;



 public class TestFlashRemoting extends Sprite {

  private var _service:RemotingService;

  public function TestFlashRemoting() {

   

   //    

   _service = new RemotingService("http://localhost:8500/flashservices/gateway");

   

   //  FlashRemoting  

   /*

    * RemotingService.call([   ],[    ],[    ]...);

    */

   _service.call("myservice.getString",new Responder(onResult, onFault),"kinglong");

  }

  

  

  //

  private function onResult(result:Object):void {

   trace("result:"+result);

  }

  //      

  private function onFault(fault:Object):void {

   trace("fault:"+fault.details);

  }

 } 

}

 

   

      Coldfusion Component  



view plaincopy to clipboardprint?

<!---    myservice.cfc--->   

<cfcomponent   displayname="    ">     

     

<!---   getString  ,  access  remote,  Flash   remoting       --->   

     

<cffunction name="getString" access="remote"   returntype="string">     

      

<cfargument name="name" type="string"   required="true">     

      

<cfset myResult = arguments.name &   ",   !">     

      

<cfreturn myResult>     

     

</cffunction>     

</cfcomponent>   

<!---    myservice.cfc--->

<cfcomponent   displayname="    "> 

 

<!---   getString  ,  access  remote,  Flash   remoting       --->

 

<cffunction name="getString" access="remote"   returntype="string"> 

  

<cfargument name="name" type="string"   required="true"> 

  

<cfset myResult = arguments.name &   ",   !"> 

  

<cfreturn myResult> 

 

</cffunction> 

</cfcomponent>  

 
利点:1.転送データ型が豊富です.2.AMF 0、AMF 3の2種類のデータパッケージタイプをサポートすることができ、AMF 3はFlash Player 9以上でサポートすることができ、AMF 3があれば、バイナリファイルストリームデータを直接転送することができる.3.伝送効率が比較的高い.4.様々なバックグラウンドへのサポートも良い.FDS(LCDS)-AdobeがメインプッシュするFlashRemotingサービス側で、機能が強く(もちろんAMF 0、AMF 3フォーマット、java、netプラットフォームもサポート)、品質も悪くないが、残念ながらこれは銀が必要だ.Blazeds-はAdobeのもう一つのオープンソースのFlashRemotingプロジェクトであり、Javaプラットフォームベース、AMF 0、AMF 3フォーマットAmfphpをサポートする-PHPベースのRPCツールであり、FlashRemotingにおけるAMF 0とAMF 3の2つのフォーマット、オープンソースプロジェクトをサポートする.Openmf-JavaベースのFlashRemotingオープンソースプロジェクトで、現在はAMF 0形式のみサポートされています.GDS(Granite Data Services)-AMF 3をサポートするJavaプラットフォームベースのFlashRemotingプロジェクトでもあります.WebORB-.net、java、php、rubyなどの開発プラットフォームをサポートするFlashRemotingプロジェクトで、AMF 0とAMF 3もサポートされています.FluorineFx-.net開発プラットフォームをサポートするFlashRemotingオープンソースプロジェクト、AMF 0、AMF 3、RTMP、RTMPT.
欠点:1.バックグラウンドサービス側に対応するバージョンのFlash Remotingモジュールが必要です.2.仮想ホストを使用する場合は構成が面倒です. 三、WebService      個人的にはWebServiceのデータアクセス速度はRemotingに次ぐと思いますが、WebServiceは汎用的なインタフェースで、一般的にサービス側の技術がサポートされています!      WebServiceのメリット:       1.WebServiceのインタフェースのサポートは比較的に広い(Java、ASP.Net、PHP、Coldfusion-私は以下の例を挙げる).       2.WebServiceは汎用的なインタフェースなので、サービス側が書くインタフェースは、Flashの使用に限らず、他のプログラムも呼び出すことができ、「一挙両得」です!       3.WebServiceはRemotingと同様に、さまざまなデータ型をサポートしています.       4.今日、FMSはRemotingインタフェースのほかに、WebServiceインタフェースもサポートしていることがわかりました:)     WebServiceの欠点:       Flashクライアントは問題なく、Flashの開発ツールには(WebServiceConnectorコンポーネント)が付属していますが、サービス側はこのインタフェース技術をサポートしていることが多いとはいえ、ColdfusionがWebServicesを生成するのに便利であるほか、他の実装は複雑です!
//=======================================;

// Flash     ;

//                 WebServiceConnector   ,          。

//              WebService  。

//           WebServiceConnector        ,         。

//=======================================;

stop();

//  WebService ;

import mx.services.WebService;

//  WebService   ;

var ws_url:String = http://localhost:8500/klstudio/myservice.cfc?wsdl;

//  WebService  ;

var ws:WebService = new WebService(ws_url);

//  WebService  ;

var callObject = ws.getString("kinglong");

//

callObject.onResult = function(result){

     trace("result:"+result);

}

//          (      );

callObject.onFault = function(fault){

    trace("fault:"+fault.faultstring);

}

 



  :              ,           ,           !



 





================================================================

         (     Coldfusion Component  ,              )

================================================================

<!---    myservice.cfc--->

<cfcomponent displayname="    "> 

  <!---   getString  ,  access  remote,  WebService       --->

  <cffunction name="getString" access="remote" returntype="string"> 

   <cfargument name="name" type="string" required="true"> 

   <cfset myResult = arguments.name & ",   !"> 

   <cfreturn myResult> 

  </cffunction> 

</cfcomponent> 

 
 
呼び出すときは、cfcパスの後ろに「?wsdl」を付けるだけでいいので、便利でしょう.
 
四、XMLSocket
    LoadVars(XML)、Flash Remoting、Webservice、XMLSocketの4つの方法でまとめた最終編ですが、お待たせいたしました前の文章がネット上でとても人気があるとは思いませんでした.その中の一人が私にメールを送ってくれました.私のこの最后の文章を见て、ははは、やはりとても喜んでいます.転载に対して私は声明します.まず、このいくつかの文章は転载を歓迎しますが、文章の作者を说明して、文章の元の住所を说明しましょう.私はいくつかのウェブサイトの転载を発见して、作者さえ书かないか书かないでください.そうです.この点は私がこれから文章を書く気持ちに影響しますので、ここで説明します!).これから本題に移ります!XMLSocketは主にサービス側とのインスタント通信に使われ、現在の応用分野は主にFlashテキストチャットやFlashオンラインゲームなどです.    XMLSocketの利点:    1、サービス側と即時に通信できる;    2、Flash Player 5.0以上のバージョンにはクラスが内蔵されており、コンポーネントやプラグインを別途インストールする必要はありません.    3、XMLSocketはSocketクライアントに相当するので、一般的なミドルウェアはjava、.Netなどをサポートしています.    XMLSocketの欠点:    1、XMLSocketは文字列またはxml形式のテキストしか伝送できず、データ型は単一である.    2、XMLSocketサービス側が自ら開発する場合、Socket技術を比較して理解する必要がある.幸い、ネット上には既成のサービス側ソフトウェア(商業のXMLSocketサーバーにはUnity、Fortressがあり、オープンソースのXMLSocketサーバーにはOregano Multiuserサーバーがある)がある.    3、それからXMLSocketの80ポートとflashセキュリティポリシーの問題です.(ネット上に解決方法がありますが、実行可能かどうかは自分で検証してください)
 
//=======================================;

// Flash   ( Flash      );

//=======================================;

var paramObj:Object = new Object();

//

paramObj.CommandDelimiters = "-@@##@@-";

//

paramObj.PeopleDelimiters = "-@#@-";

//  XMLSocket  ;

var socket:XMLSocket = new XMLSocket();

//

socket.onConnect = function(success) {

trace("socket.onConnect:"+success);

if (!success) {

trace("       ,       !");

}

};

//

socket.onClose = function() {

trace("      !");

logoutChat();

};

//

socket.onData = function(src) {

//trace("socket.onData:"+src);

doCommand(getCmdArrayByMsg(trim(src)));

};

//

function loginChat():Void {

//  Socket   ;

socket.connect(“localhost”, “8888”);

sendSocket("INFO"+paramObj.CommandDelimiters+msg);

}

//

function logoutChat(b:Boolean):Void {

sendSocket("QUIT");

}

//

function showChat(msg:String):Void {

trace(“    :”+msg);

}

//

function sendChat(msg:String):Void{

sendSocket("MSG"+paramObj.CommandDelimiters+msg+paramObj.CommandDelimiters+msg);

}

//

function sendSocket(msg:String):Void {

socket.send(msg+"\r");

}



//

function getCmdArrayByMsg(msg:String):Array {



if (msg.charCodeAt(0) == 13 && msg.charCodeAt(1) == 10) {



msg = msg.substr(2);



}



return msg.split(paramObj.CommandDelimiters);



}



function doCommand(arr:Array):Void {

switch (arr[0]) {

case "MSG" :

showChat(arr[1]);

break;

case "TAKEN" :

trace("         ,         !");

break;

case "PEOPLE" :

doPeople(arr[1]);

break;

}

}

//

function doPeople(msg:String):Void {

var people_arr:Array = msg.split(paramObj.PeopleDelimiters);

trace(people_arr);

}

 



 





//   XMLSocket       ,               !

//      , flash                 “\r”,           (       Java   )



 



//=======================================;

//      (  java   ,        );

// ChatServer.java

//=======================================;

package com.klstudio.socket.chat;



import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Vector;



//import com.klstudio.util.Logger;



/**

* @author kinglong

* 

* TODO               ,     -   - Java -    -    

*/

public class ChatServer {

//private Logger logger;

private static Vector clients = new Vector();

private static ServerSocket server = null;

private static Socket socket = null;

public static String CommandDelimiters = "-@@##@@-";

public static String PeopleDelimiters = "-@#@-";



public ChatServer() {

}



public static void notifyRoom() {

StringBuffer people = new StringBuffer("PEOPLE"+CommandDelimiters+"    ");

for (int i = 0; i < clients.size(); i++) {

Client client = (Client) clients.elementAt(i);

people.append(PeopleDelimiters+client.getClientName());

}

sendClients(people);

}

public staticboolean checkName(Client newClient){

for(int i=0;i<clients.size();i++){

Client client = (Client) clients.elementAt(i);

if(client != newClient && client.getClientName().equals(newClient.getClientName())){

return false;

}

}

return true;

}

public static void closeAll(){

while(clients.size()>0){

Client client = (Client) clients.firstElement();

try {

client.getClientSocket().close();

} catch (IOException e) {

// TODO      catch  

//Logger logger = new Logger(System.out);

//logger.log("  -" + e.toString());

} finally {

clients.removeElement(client);

}

}

}

public static synchronized void disconnect(Client client) {

client.send(new StringBuffer("QUIT"));

try {

client.getClientSocket().close();

} catch (IOException e) {

// TODO      catch  

//Logger logger = new Logger(System.out);

//logger.log("  -" + e.toString());

} finally{

clients.removeElement(client);

}



}



public static synchronized void sendClients(StringBuffer sb) {

for(int i=0;i<clients.size();i++){

Client client = (Client) clients.elementAt(i);

client.send(sb);

}

}



public static synchronized void sendClients(StringBuffer sb,String ownerName,String toName) {

for(int i=0;i<clients.size();i++){

Client client = (Client) clients.elementAt(i);

if(toName.equals(client.getClientName()) || toName.equals("    ") || ownerName.equals(client.getClientName())){

client.send(sb);

}

}

}



public static synchronized void sendClients(Client ownerClient) {

for(int i=0;i<clients.size();i++){

Client client = (Client) clients.elementAt(i);

if(client.getClientName().equals(ownerClient.getClientName())){

client.send(new StringBuffer("MSG"+CommandDelimiters+"    >     !"));

}else{

client.send(new StringBuffer("MSG"+CommandDelimiters+"    >["+ownerClient.getClientName()+"]    !"));

}

}

}

public static void main(String[] args) {

int port = 8888; 

if(args.length>0){

port = Integer.parseInt(args[0]);

}

//Logger logger = new Logger(System.out);

//logger.log("  -ChatServer["+port+"]      ...");

try {

server = new ServerSocket(port);

} catch (IOException e) {

// TODO      catch  

//logger.log("  -"+e.toString());

}

while(true){

if(clients.size()<5){

try {

socket = server.accept();

if(socket != null){

//logger.log("  -"+socket.toString()+"  ");

}

} catch (IOException e) {

// TODO      catch  

//logger.log("  -"+e.toString());

}

int i=0;

do{

Client client = new Client(socket);

if(client.getClientName() != null){

clients.addElement(client);

if(checkName(client)){

//logger.log("  -"+"   ["+clients.size()+"]      ");

sendClients(client);

client.start();

notifyRoom();

}else{

client.send(new StringBuffer("TAKEN"));

disconnect(client);

}

i++;

}

break;

}while(i<clients.size());



}else{

try {

Thread.sleep(200);

} catch (InterruptedException e) {

// TODO      catch  

//logger.log("  -"+e.toString());

}

}

}

}

}





 



//=======================================;

// Client.java

//=======================================;

/*

*     2005-10-10

*

* TODO             ,   

*   -   - Java -    -    

*/

package com.klstudio.socket.chat;



import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintStream;

import java.net.Socket;

//import com.klstudio.util.Logger;



/**

* @author kinglong

* 

* TODO               ,     -   - Java -    -    

*/

public class Client extends Thread {

private Socket clientSocket;

private String clientName;

private String clientIp;

private BufferedReader br;

private PrintStream ps;

//private Logger logger;

private ChatServer server;



public Client(Socket socket) {

//this.logger = new Logger(System.out);

this.clientSocket = socket;

try {

this.br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));

this.ps = new PrintStream(socket.getOutputStream(),true,"utf-8");

String info = this.br.readLine();



if(info!=null){

String[] info_arr = info.split(ChatServer.CommandDelimiters);

if(info_arr.length>1){

this.clientName = info_arr[1];

}

this.clientIp = socket.getRemoteSocketAddress().toString();

}else{

socket.close();

}

} catch (IOException e) {

// TODO      catch  

//this.logger.log("  -" + e.toString());

}

}



/**

* @return    ip。

*/

public String getClientIp() {

return clientIp;

}

/**

* @return    name。

*/

public String getClientName() {

return clientName;

}



/**

* @return    socket。

*/

public Socket getClientSocket() {

return clientSocket;

}

public void send(StringBuffer msg){

this.ps.println(msg.toString()+"\0");

//this.ps.flush();

}

public void run() {

while (true) {

String line = null;

try {

line = this.br.readLine();

} catch (IOException e) {

// TODO      catch  

//this.logger.log("  -" + e.toString());

ChatServer.disconnect(this);

ChatServer.notifyRoom();

return;

}

if (line == null) {

//this.logger.log("  -[" + this.clientName + this.clientIp + "]    !");

ChatServer.disconnect(this);

ChatServer.notifyRoom();

if(this.clientName != null){

ChatServer.sendClients(new StringBuffer("MSG"+ChatServer.CommandDelimiters+"    >[" + this.clientName + "]    !"));

}

return;

}

//this.logger.log("  -"+line);

String[] cmd_arr = line.split(ChatServer.CommandDelimiters);

String keyword = cmd_arr[0];

keyword = keyword.substring(1);

if(keyword.equals("MSG")){

StringBuffer msg = new StringBuffer("MSG"+ChatServer.CommandDelimiters);

msg.append(this.clientName+">");

msg.append(cmd_arr[1]);

ChatServer.sendClients(msg,this.clientName,cmd_arr[2]);

}else if(keyword.equals("QUIT")){

//this.logger.log("  -[" + this.clientName + this.clientIp + "]    !");

ChatServer.disconnect(this);

ChatServer.notifyRoom();

ChatServer.sendClients(new StringBuffer("MSG"+ChatServer.CommandDelimiters+"    >[" + this.clientName + "]    !"));

this.stop();

return;

}

}

}

}