title: AS3 Telnet Sample not reading responses
body: <p>i am testing a sample I got from adobe, the TelnetSocket sample. This is the code:</p>
  
  <p><strong>TelnetSocket.mxml:</strong></p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
      layout="vertical"&gt;
  
      &lt;mx:Script&gt;
          &lt;![CDATA[
              import com.example.programmingas3.socket.Telnet;
              private var telnetClient:Telnet;
              private function connect():void {
                  telnetClient = new Telnet(serverName.text, int(portNumber.text), output);
                  console.title = "Connecting to " + serverName.text + ":" + portNumber.text;
                  console.enabled = true;
              }
              private function sendCommand():void {
                  var ba:ByteArray = new ByteArray();
                  ba.writeMultiByte(command.text + "\n", "UTF-8");
                  telnetClient.writeBytesToSocket(ba);
                  command.text = "";
              }
          ]]&gt;
      &lt;/mx:Script&gt;
  
      &lt;mx:Label id="title" text="Telnet Socket Example" fontSize="24" fontStyle="italic" /&gt;
      &lt;mx:Label id="subtitle" text="From Programming ActionScript 3.0, Chapter 22: Networking and communication" fontSize="12" /&gt;
  
      &lt;mx:ApplicationControlBar width="100%"&gt;
          &lt;mx:Label text="Server:" /&gt;
          &lt;mx:TextInput id="serverName" width="100%" /&gt;
          &lt;mx:Spacer /&gt;
          &lt;mx:Label text="Port:" /&gt;
          &lt;mx:TextInput id="portNumber" text="23" textAlign="right" maxChars="5" restrict="0-9" /&gt;
          &lt;mx:Spacer /&gt;
          &lt;mx:Button label="Login" click="connect();" /&gt;
      &lt;/mx:ApplicationControlBar&gt;
  
      &lt;mx:Spacer /&gt;
  
      &lt;mx:Panel id="console" enabled="false" width="100%" height="100%" paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10"&gt;
          &lt;mx:TextArea id="output" editable="false" width="100%" height="100%" fontFamily="Courier New" /&gt;
          &lt;mx:ControlBar&gt;
              &lt;mx:Label text="Command:" /&gt;
              &lt;mx:TextInput id="command" width="100%" enter="sendCommand();" /&gt;
              &lt;mx:Button label="Send" click="sendCommand();" /&gt;
          &lt;/mx:ControlBar&gt;
      &lt;/mx:Panel&gt;
  
  &lt;/mx:Application&gt;
  </code></pre>
  
  <p><strong>com\example\programmingas3\socket\Telnet.as:</strong></p>
  
  <pre><code>package com.example.programmingas3.socket {
      import flash.events.*;
      import flash.net.Socket;
      import flash.system.Security;
      import flash.utils.ByteArray;
      import flash.utils.setTimeout;
  
      import mx.controls.TextArea;
      import mx.core.UIComponent;
  
      public class Telnet extends UIComponent{
          private const CR:int = 13; // Carriage Return (CR)
          private const WILL:int = 0xFB; // 251 - WILL (option code)
          private const WONT:int = 0xFC; // 252 - WON'T (option code)
          private const DO:int   = 0xFD; // 253 - DO (option code)
          private const DONT:int = 0xFE; // 254 - DON'T (option code)
          private const IAC:int  = 0xFF; // 255 - Interpret as Command (IAC)
  
          private var serverURL:String;
          private var portNumber:int;
          private var socket:Socket;
          private var ta:TextArea;
          private var state:int = 0;
  
          public function Telnet(server:String, port:int, output:TextArea) {
              // set class variables to the values passed to the constructor.
              serverURL = server;
              portNumber = port;
              ta = output;
  
              // Create a new Socket object and assign event listeners.
              socket = new Socket();
              socket.addEventListener(Event.CONNECT, connectHandler);
              socket.addEventListener(Event.CLOSE, closeHandler);
              socket.addEventListener(ErrorEvent.ERROR, errorHandler);
              socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
              socket.addEventListener(ProgressEvent.SOCKET_DATA, dataHandler);
  
              // Load policy file from remote server.
              Security.loadPolicyFile("http://" + serverURL + "/crossdomain.xml");
              // Attempt to connect to remote socket server.
              try {
                  msg("Trying to connect to " + serverURL + ":" + portNumber + "\n");
                  socket.connect(serverURL, portNumber);
              } catch (error:Error) {
                  /*
                      Unable to connect to remote server, display error 
                      message and close connection.
                  */
                  msg(error.message + "\n");
                  socket.close();
              }
          }
  
          /**
           * This method is called if the socket encounters an ioError event.
           */
          public function ioErrorHandler(event:IOErrorEvent):void {
              msg("Unable to connect: socket error.\n");
          }
  
          /**
           * This method is called by our application and is used to send data
           * to the server.
           */
          public function writeBytesToSocket(ba:ByteArray):void {
              socket.writeBytes(ba);
              socket.flush();
          }
  
          private function connectHandler(event:Event):void {
              if (socket.connected) {
                  msg("connected...\n");
              } else {
                  msg("unable to connect\n");
              }
          }
  
          /**
           * This method is called when the socket connection is closed by 
           * the server.
           */
          private function closeHandler(event:Event):void {
              msg("closed...\n");
          }
  
          /**
           * This method is called if the socket throws an error.
           */
          private function errorHandler(event:ErrorEvent):void {
              msg(event.text + "\n");
          }
  
          /**
           * This method is called when the socket receives data from the server.
           */
          private function dataHandler(event:ProgressEvent):void {
              var n:int = socket.bytesAvailable;
              // Loop through each available byte returned from the socket connection.
              while (--n &gt;= 0) {
                  // Read next available byte.
                  var b:int = socket.readUnsignedByte();
                  switch (state) {
                      case 0:
                          // If the current byte is the "Interpret as Command" code, set the state to 1.
                          if (b == IAC) {
                              state = 1;
                          // Else, if the byte is not a carriage return, display the character using the msg() method.
                          } else if (b != CR) {
                              msg(String.fromCharCode(b));
                          }
                          break;
                      case 1:
                          // If the current byte is the "DO" code, set the state to 2.
                          if (b == DO) {
                              state = 2;
                          } else {
                              state = 0;
                          }
                          break;
                      // Blindly reject the option.
                      case 2:
                          /*
                              Write the "Interpret as Command" code, "WONT" code, 
                              and current byte to the socket and send the contents 
                              to the server by calling the flush() method.
                          */
                          socket.writeByte(IAC);
                          socket.writeByte(WONT);
                          socket.writeByte(b);
                          socket.flush();
                          state = 0;
                          break;
                  }
              }
          }
  
          /**
           * Append message to the TextArea component on the display list.
           * After appending text, call the setScroll() method which controls
           * the scrolling of the TextArea.
           */
          private function msg(value:String):void {
              ta.text += value;
              ta.dispatchEvent(new Event(Event.CHANGE));
              setTimeout(setScroll, 100);
          }
  
          /**
           * Scroll the TextArea component to its maximum vertical scroll 
           * position so that the TextArea always shows the last line returned
           * from the server.
           */
          public function setScroll():void {
              ta.verticalScrollPosition = ta.maxVerticalScrollPosition;
          }
      }
  }
  </code></pre>
  
  <p>I compiled it with mxmlc path\to\file\TelnetSocket.mxml and compiles fine, but when I test it, it just says: "Trying to connect to ..." and stays there. i tried connecting to public telnet BBS servers like "telnet://fix.no", and I opened wireshark, when i clicked the "Login" button on the swf, the log said "Trying to connect to..." and staid there, but on Wireshark I can see the telnet response that I'd see if telneting from console.</p>
  
  <p>I tested multiple servers, all with the same result.</p>
  
  <p><strong>So what could be happening to cause this to not read the response from the servers?</strong></p>