0

Adobe から入手したサンプル、TelnetSocket サンプルをテストしています。これはコードです:

TelnetSocket.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="vertical">

    <mx:Script>
        <![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 = "";
            }
        ]]>
    </mx:Script>

    <mx:Label id="title" text="Telnet Socket Example" fontSize="24" fontStyle="italic" />
    <mx:Label id="subtitle" text="From Programming ActionScript 3.0, Chapter 22: Networking and communication" fontSize="12" />

    <mx:ApplicationControlBar width="100%">
        <mx:Label text="Server:" />
        <mx:TextInput id="serverName" width="100%" />
        <mx:Spacer />
        <mx:Label text="Port:" />
        <mx:TextInput id="portNumber" text="23" textAlign="right" maxChars="5" restrict="0-9" />
        <mx:Spacer />
        <mx:Button label="Login" click="connect();" />
    </mx:ApplicationControlBar>

    <mx:Spacer />

    <mx:Panel id="console" enabled="false" width="100%" height="100%" paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">
        <mx:TextArea id="output" editable="false" width="100%" height="100%" fontFamily="Courier New" />
        <mx:ControlBar>
            <mx:Label text="Command:" />
            <mx:TextInput id="command" width="100%" enter="sendCommand();" />
            <mx:Button label="Send" click="sendCommand();" />
        </mx:ControlBar>
    </mx:Panel>

</mx:Application>

com\example\programmingas3\socket\Telnet.as:

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 >= 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;
        }
    }
}

私はそれを mxmlc path\to\file\TelnetSocket.mxml でコンパイルし、正常にコンパイルしましたが、テストすると、「接続しようとしています...」と表示されたままになります。「telnet://fix.no」のようなパブリック telnet BBS サーバーに接続しようとしました。wireshark を開き、swf の「ログイン」ボタンをクリックすると、ログに「接続しようとしています...」と表示され、停止しました。そこにはありますが、Wireshark では、コンソールから telnet を実行した場合に表示される te​​lnet 応答を確認できます。

複数のサーバーをテストしましたが、すべて同じ結果でした。

では、これがサーバーからの応答を読み取らない原因は何でしょうか?

4

1 に答える 1

0

この例は正常に動作します。クライアント側 (コンピューター) またはサーバー (telnet サーバー) のファイアウォールに関連する問題である必要があります。

于 2012-05-24T06:56:40.863 に答える