Гибкие розетки и петли - PullRequest
0 голосов
/ 13 января 2012

Хорошо, вот и все.

В моей сети у меня есть пара компьютеров, на которых запущен специальный сервер, который будет возвращать имя пользователя, вошедшего в систему при запросе.

У меня есть следующеекусок кода.

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

ГдеЯ ожидал бы, что все соединятся и бегут счастливо.У кого-нибудь есть идеи о том, где это терпит неудачу?

Ответы [ 2 ]

1 голос
/ 18 января 2012

ОК. Вот решение, которое я придумала: таймеры, счетчик и массив значений. Я предварительно заполняю массив циклом при запуске.

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 голос
/ 13 января 2012

Похоже, вы не понимаете, что 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 () из обратных вызовов.Не синхронно, как вы написали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...