2012-01-13 48 views
0

好吧,在這裏。彈性插座和循環

在我的網絡上,我有幾臺電腦都運行一個定製服務器,它將返回查詢時登錄的用戶名。

我有以下一段代碼。

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

現在,當它運行它不起作用,因爲我第一次想到。迭代去。第四個十進制值遞減。但有些奇怪的事情發生。你會注意到在上面的代碼中我有一個硬編碼的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

好這裏是我提出的涉及計時器,計數器和值數組的解決方案。我在開始時用一個循環預先填充數組。

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()調用鏈接到你回調中最後一個連接的響應結尾。 Trickier,但可行。

如果您嘗試與至少一臺服務器建立連接,那麼您需要執行類似於我所描述的操作。如果出現問題,請嘗試1,嘗試2等。但是您必須從回調中啓動下一個connect()調用。不像你寫的那樣同步。

+0

謝謝。我確實理解異步位。 「IN REad功能 數據收到 用戶名/ 192.168.0.1 」位通過連接處理程序完成。我期待每個循環迭代運行調用併產生相同的文本,所以對於6次迭代,如上所述,我期望看到上述6次不是1.如代碼所示,我有一個硬編碼的IP和teh服務器是總是在這上面運行,所以這應該刪除任何IO錯誤,因爲它不是有效的IP等。當我運行代碼的其他部分時,該服務器立即返回。 – user1148158 2012-01-13 21:25:44