2012-01-13 4 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

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, если есть проблема, попробуйте 2 и т. Д. Но вам придется инициировать следующий вызов connect() из обратных вызовов. Не синхронно, как вы писали.

+0

спасибо. Я понимаю асинхронный бит. Функция «IN READ» полученных данных имя пользователя/192.168.0.1 «бит выполняется с помощью обработчика соединения.Я ожидал, что каждая итерация цикла запустит вызов и произведет один и тот же текст, поэтому для 6 итераций, как это делается выше, я ожидаю увидеть выше 6 раз не 1. Как показано в коде, у меня есть жестко закодированный IP, а сервер всегда работает на этом, и поэтому это должно удалить любые ошибки ввода-вывода из-за того, что он не является допустимым IP-адресом и т. д. Этот сервер немедленно возвращается, когда я запускаю другие части кода. – user1148158

Смежные вопросы