2012-01-13 8 views
0

ここに行きます。フレックスソケットとループ

私のネットワーク上では、いくつかのPCがすべて注文されたサーバーを実行しており、問い合わせを受けたときにログインしたユーザーのユーザー名が返されます。

次のコードがあります。

private function LoopAndList():void 
     { 
      var loopSocket:Socket; 
      var fourthOctet:Number = 6; 
      var stubIP:String = "192.168.0."; 
      var loophost:String; 

      loopSocket = new Socket(); 
      loopSocket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 
      loopSocket.addEventListener(Event.CONNECT, connectHandler); 
      loopSocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
      loopSocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
      textarea1.text = ""; 

      while (fourthOctet != 0) 
      { 

       loophost = stubIP + fourthOctet; 
       textarea1.text = textarea1.text + loophost + "\n"; 
       textarea1.text = textarea1.text + "Connecting to: " + loophost + "\n"; 
       try 
       { 
       loopSocket.connect("192.168.0.4", 19001); 
       fourthOctet--; 
       } 
       catch(ioError:IOError) 
       { 
        textarea1.text = textarea1.text + "Sec error \n "; 
        fourthOctet--; 
       } 
       catch(secError:SecurityError) 
       { 

        textarea1.text = textarea1.text + "io error \n"; 
        fourthOctet--; 
       } 

これを実行すると、最初に考えたように動作しません。反復は行く。 4番目のオクテットの値がデクリメントされます。しかし、奇妙なことが起こる。上記のコードでは、ループ内にハードコードされたIPアドレスがあることに気づくでしょう。私はそこに常に有効な接続があることを保証するためにこれを入れました。それで、常に192.168.0.4に接続することに気付いています。

ただし、接続は最後の接続呼び出しでのみ発生します。

出力に含まがある:私はすべてを接続して喜んで実行するように期待する

192.168.0.6 
Connecting to 192.168.0.6 
192.168.0.5 
Connecting to 192.168.0.5 
... 
192.168.0.1 
Connecting to 192.168.0.1 
Sending Data 
IN REad function 
data received 
username/192.168.0.1 

。誰がこれが失敗しているかについてのアイデアはありますか?

答えて

1

OKこれは、タイマ、カウンタ、および値の配列を含む解決策です。私は開始時にループを配列にあらかじめ入れておく。

var timer:Timer = new Timer(1000, 4); 

      textarea1.text = ""; 
      loopSocket = new Socket(); 

      timer.start(); 
      timer.addEventListener(TimerEvent.TIMER, bogoffflex); 

      function bogoffflex():void 
      { 
       textarea1.text = textarea1.text + "Timer fired " + count + "\n"; 
       textarea1.text = textarea1.text + loopSockArr[count] + "\n"; 
       loopSocket.addEventListener(Event.CONNECT, onConnect); 
       loopSocket.addEventListener(Event.CLOSE, onClose); 
       loopSocket.addEventListener(ProgressEvent.SOCKET_DATA, recvdata); 
       try 
       { 
       //loopSocket.timeout = 1000; 
       loopSocket.connect(loopSockArr[count] , 19001); 
       count ++; 
       } 

結果は、私が望んでいたより少し遅いですが許容されます。

1

Socket.connect()が非同期であることを理解できないようです。したがって、あなたのループを実行し、テキストを変更することは、あなたがそのループで接続していないために思ったことをすることではありません。 connect()が呼び出された後、すぐにホストに接続するのを待たずに戻ります。 connctHandlerコールバックのテキスト領域は、その時点で本当に接続されているため変更する必要があります。あなたのエラー処理にも同じことが起こります。サーバーの電源が入っていない、ビジー状態、タイムアウトしているなどの理由で、応答が表示されない可能性があります。最初に戻ってくるサーバーはおそらくアクティブサーバーであり、他のサーバーは存在しない、到達不能なネットワークエラー、 。基本的に、接続は30秒以上待って応答待ちになります。

質問がありません。コードがあなたに求めたことをしているので、何を達成しようとしていますか?なぜこれをやっているのかは明らかではありません。

基本的にそれはすべての非同期だと、あなたの出力は、このようにきれいになるだろうされていません:それは、平行して、要求と応答ですべてが起こるだろう

Connected to 1, here is what I sent to 1, here is 1 told me 
Connect to 2, here is what I sent to host 2, here is what host 2 told me 
Connect 3, etc. 

は、各ホストとネットワークの応答として返すしようとしていますそれを可能にする。それで、それはすべて一緒に夢中になるでしょう。シリアル化するコードを変更することはできますが、コールバック内の最後の接続からの応答の最後にconnect()コールをチェーンする必要があります。トリッキーだが、できる。

少なくとも1つのサーバーとの接続を確立しようとしている場合は、私が説明しているような何かをする必要があります。問題がある場合は1、2を試してみてください。しかし、コールバック内から次のconnect()コールを開始する必要があります。あなたが書いたように同期的ではありません。

+0

ありがとうございます。私は非同期ビットを理解しています。 「IN READ関数 データ受信 username/192.168.0.1 」ビットは接続ハンドラを介して行われます。私は各ループの反復が呼び出しを実行し、同じテキストを生成することを期待していたので、上記のように6回反復すると、上記の6回は見えなくなります。コードに示されているように、常にこれで実行されるので、有効なIPなどでないためにIOエラーが取り除かれるはずです。このサーバーは、コードの他の部分を実行するとすぐに戻ります。 – user1148158