??????????????????????????????????????????????Щ???????????????????????????????????????????????Щ???????????????δ???????????Щ???????????????????????????????????????????????????Flash??????棬??????????????????????????????????????????????Щ????????????????????????????????????????????C/S?????Flash?????????????????γ????

????Flash??????????????????????????????Socket?????AS3.0???????????????????????XML??????????XMLSocket??????????????????Socket?????????????????????????XML????????????????????????????????????????????????XMLSocket?????Socket?????????????????Χ?????????????

???????????????????м????н??????????γ?????????????δ??????????λ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

????Flash??Socket?????????TCP??????????????????????????ν?????????????????????Щ???????????????????????????????????????????????????????????????????????????????????????ж???????????????????????????????????????????????????????????????????????????????????????????δ???????????????????????????????????λ?????????????????????浽?????У?????????????????????????е??????δ?????????

package
 {
     import flash.display.Sprite;
     import flash.net.Socket;
     import flash.events.IOErrorEvent;
     import flash.events.SecurityErrorEvent;
     import flash.events.ProgressEvent;
     import flash.events.Event;
     import flash.errors.IOError;
     import flash.events.MouseEvent;
     import flash.errors.EOFError;
     import flash.system.Security;
     import flash.utils.ByteArray;
    
     /**
      *
      * @author whk
      */
     public class SocketExample extends Sprite
     {
         private var targetServer:String = "192.168.0.68"; //????ip???
         private var port:uint = 9991; //??????       
         private var socket:Socket;
         private var str:String;
         private var response:String;
         private var msgLenMax:int; //????????????
         private var msgLen:int; //???????
         private var headLen:int; //????????
         private var isReadHead:Boolean; //??????????????
         private var bytes:ByteArray; //??????????????????????????????????
        
         public function SocketExample()
         {
             isReadHead = true;
             headLen = 2; //2?????
             msgLenMax = 4028;
             bytes = new ByteArray();
             //Security.loadPolicyFile("socket://"+targetServer+":"+port);
             socket = new Socket();
             btnSend.enabled = false;
             btnConnect.addEventListener(MouseEvent.CLICK?? btnHandler);
         }
        
         /**
          * ?????????
          */
         private function btnHandler(event:MouseEvent):void
         {
             switch (event.target.name)
             {
                 case "btnConnect":
                     btnLabel();
                     break;
                 case "btnSend":
                     sendRequest();
                     break;
             }
         }
        
         private function btnLabel():void
         {
             if (btnConnect.label == "????" || btnConnect.label == "????????")
             {
                 //???socket???
                 configureListeners();
                 //????socket????
                 connectToSocketServer();
             }
             if (btnConnect.label == "???????")
             {
                 if (socket.connected)
                 {
                     socket.close();
                     btnConnect.label = "????";
                     pringMessage("?????????????");
                 }
             }
         }
        
         /**
          * ????socket??????
          */
         private function connectToSocketServer():void
         {
             try
             {
                 socket.connect(targetServer?? port);
             }
             catch (error:SecurityError)
             {
                 pringMessage("SecurityError: " + error);
             }
        
         }
        
         private function configureListeners():void
         {
             socket.addEventListener(Event.CONNECT?? connectHandler);
             socket.addEventListener(Event.CLOSE?? closeHandler);
             socket.addEventListener(IOErrorEvent.IO_ERROR?? ioErrorHandler);
             socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR?? securityErrorHandler);
             socket.addEventListener(ProgressEvent.SOCKET_DATA?? socketDataHandler);
         }
        
         /**
          * ??????
          */
         private function connectHandler(event:Event):void
         {
             btnSend.enabled = true;
             btnConnect.label = "???????";
             pringMessage("??????" + " " + "connectHandler: " + event + " ");
             btnSend.addEventListener(MouseEvent.CLICK?? btnHandler);
             trace("connectHandler: " + event);
             trace(txtRead.text);
         }
        
         /**
          * ???????????????
          */
         private function sendRequest():void
         {
             trace("sendRequest");
             response = "";
             //????????
             writeln("GET /");
         }
        
         private function writeln(str:String):void
         {
             str += txtSend.text + " ";
             if (socket.connected)
             {
                 try
                 {
                     //??UTF-8?????д???????
                     socket.writeInt(int(str));
                     txtRead.text += "??????????????" + str;
                     socket.flush();
                 }
                 catch (error:IOError)
                 {
                     pringMessage("socket.flush error " + error);
                 }
             }
             else
             {
                 //????socket????
                 connectToSocketServer();
             }
         }
        
         /**
          * ??????????????
          */
         private function socketDataHandler(event:ProgressEvent):void
         {
             trace("socketDataHandler: " + event);
             readResponse();
         }
        
         private function readResponse():void
         {
             try
             {
                 //parseNetData();
                 var str:String = socket.readUTFBytes(socket.bytesAvailable);
                 response += str;
                 trace(response);
                 //?????????
                 while (socket.bytesAvailable)
                 {
                     var data:int = socket.readByte();
                     trace(data);
                 }
                 txtRead.text += "??????????" + str + " ";
             }
             catch (error:IOError)
             {
                 pringMessage("??socket??????????????I/O ?? " + "socket.read error " + error);
             }
             catch (error:EOFError)
             {
                 pringMessage("???????????????????EOF?? " + "socket.read error " + error);
             }
        
         }
        
         /**
          * ??????????????
          * ??????????????????
          */
         private function parseNetData():void
         {
             //????????????
             if (isReadHead)
             {
                 if (socket.bytesAvailable >= headLen)
                 {
                     //????????????????ж??
                     msgLen = socket.readShort();
                     isReadHead = false;
                 }
             }
             //?????????????????????????????????????????
             if (!isReadHead && msgLen <= msgLenMax)
             {
                 //????0?????????????
                 if (msgLen == 0)
                 {
                     //???????????0?????????????????????????????????????????????????????
                     return;
                 }
                 //????????????????????????????????
                 if (socket.bytesAvailable >= msgLen)
                 {
                     //?????
                     bytes.position = 0;
                     //??????????????????
                     socket.readBytes(bytes?? 0?? msgLen);
                     isReadHead = true;
                 }
             }
             //??????????????????????????????????????
             if (socket.bytesAvailable >= headLen)
             {
                 parseNetData();
             }
         }
        
         /**
          * socket?????????????
          */
         private function closeHandler(event:Event):void
         {
             btnConnect.label = "????????";
             pringMessage("socke?????????? " + "closeHandler: " + event);
             trace("closeHandler: " + event);
         }
        
         private function ioErrorHandler(event:IOErrorEvent):void
         {
             trace("ioErrorHandler: " + event);
             pringMessage("????/??????????·????????????? " + "ioErrorHandler: " + event);
         }
        
         private function securityErrorHandler(event:SecurityErrorEvent):void
         {
             trace("securityErrorHandler: " + event);
             pringMessage("????????????÷???????????????????????? 1024 ???? " + "securityErrorHandler: " + event);
         }
        
         /**
          * ?????????????
          * @param m:????????
          */
         private function pringMessage(m:String = null):void
         {
             txtError.visible = true;
             if (m == null)
             {
                 txtError.text = "";
                 txtError.visible = false;
                 return;
             }
             if (txtError.text == null)
             {
                 txtError.text = "";
                 txtError.visible = false;
             }
             txtError.text = m;
         }
    
     }
 }