Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Ошибки при пересоединении сокета. (http://www.flasher.ru/forum/showthread.php?t=198030)

MOHCTEP 18.04.2013 03:58

Ошибки при пересоединении сокета.
 
Ситуация следующая. Есть список нескольких профилей, содержащих параметры коннектов к разного рода устройствам.
Есть класс, создающий и обслуживающий эти самые соединения (сокетные).
Код AS3:

//В конструкторе создан сокет и слушатели
sender = new Socket();
initListeners()
...
private function initListeners():void {
                        sender.addEventListener(Event.CONNECT, onSenderConnect);
                        sender.addEventListener(ProgressEvent.SOCKET_DATA, onSendData);
                        sender.addEventListener(Event.CLOSE, onSenderClosing);
                        sender.addEventListener(IOErrorEvent.IO_ERROR, onIOErr);
                        sender.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurErr);/**/
}
//Получаем профиль и соединяемся...
public function set profile(value:Object):void {
                        for (var i:String in value) this[i] = value[i];
                        sender.connected?sender.close():null;
                        sender.connect(host, int(port));
                }

При получении следующего профиля, сокет пересоединяется, обрабатываются данные и, по завершении, запрашивается очередной профиль. Иногда сокет не может соединиться (качество связи) и выбрасывает, соответственно Error #2031: Socket Error. Это безобразие диспатчится контроллеру и он командует загрузку следующего профиля. И теперь все следующие, после "ошибочного", соединения выдают эту же ошибку, хотя они исправны на деле. Пробовал полностью обновлять сокет, на каждом профиле, проблема осталась. Если же соединения исправны, то и единственный сокет нормально разруливает все данные.
Возможно ли как-то победить это?

iflamberg 18.04.2013 14:44

Там, по-моему, надо каждый раз создать новый экземпляр сокета.

MOHCTEP 18.04.2013 15:59

Цитата:

Пробовал полностью обновлять сокет, на каждом профиле, проблема осталась.
Наверное недорассказал. Обновление и подразумевало - создание нового сокета, с предварительным уничтожением предыдущего. Вот вариант с обновлением.
Код AS3:

//
                private function newSenderSocket():Socket {
                        var s:Socket = new Socket();
                        s.addEventListener(Event.CONNECT, onSenderConnect);
                        s.addEventListener(ProgressEvent.SOCKET_DATA, onSendData);
                        //sender.addEventListener(Event.CLOSE, onSenderClosing);
                        s.addEventListener(IOErrorEvent.IO_ERROR, onIOErr);
                        s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurErr);
                        return s;
                }
 
                private function removeSenderSocket():void {
                        if (sender) {
                                sender.connected ? sender.close() : null;
                                sender.removeEventListener(Event.CONNECT, onSenderConnect);
                                sender.removeEventListener(ProgressEvent.SOCKET_DATA, onSendData);
                                sender.removeEventListener(IOErrorEvent.IO_ERROR, onIOErr);
                                sender.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurErr);
                        }
                        sender = null;
                }

Не помогло.

iflamberg 18.04.2013 16:12

Код AS3:

                private function newSenderSocket():Socket {
                        var s:Socket = new Socket();
                        s.addEventListener(Event.CONNECT, onSenderConnect);
                        s.addEventListener(ProgressEvent.SOCKET_DATA, onSendData);
                        //sender.addEventListener(Event.CLOSE, onSenderClosing);
                        s.addEventListener(IOErrorEvent.IO_ERROR, onIOErr);
                        s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurErr);
                        return s;
                }
 
                private function removeSenderSocket():void {
                        if (sender) {
                                sender.connected ? sender.close() : null;
                                sender.removeEventListener(Event.CONNECT, onSenderConnect);
                                sender.removeEventListener(ProgressEvent.SOCKET_DATA, onSendData);
                                sender.removeEventListener(IOErrorEvent.IO_ERROR, onIOErr);
                                sender.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurErr);
                        }
                        sender = null;
                }

Ну ты здесь создаешь новый сокет-клиент в локальной переменной s, а свойство класса sender не меняется. Должно помочь, должно.

C4Grey 18.04.2013 16:21

Не совсем уверен, но поробуй остановить дальнейшую обработку события об ошибке после обработки его контроллером
Код AS3:

private function onIOErr(e:IOErrorEvent):void
{
e.PreventDefault();
ConnectNextSocket();
}


MOHCTEP 18.04.2013 16:32

2 iflamberg Все меняется. Процедура, как видите, возвращает свежий сокет. Он и становится сендером, для нового профиля. Для этого в "set profile" добавлено:
Код AS3:

//removeSenderSocket();
//sender = newSenderSocket();

Говорю ж - не спасло.
2 C4Grey )) Попробую, спасибо! Алогично конечно, но что-то не придумывается ничего.
Не спасло.
Складывается впечатление, что этот IOError, каким-то непостижимым образом кешируется и "считает", что все остальные профили гиблые.

C4Grey 18.04.2013 21:19

Возможно, стоит посмотреть нет ли какой-то ошибки при подключении:
Код AS3:

try
{
  socket.connect();
}
catch(e0:IOError)
{
}
catch(e1:SecurityError)
{
}

Да, и может стоит подключать следующий после обработки CLOSE предыдущего сокета?

MOHCTEP 18.04.2013 22:13

Что интересно, событие CLOSE не приходит. Видимо железки просто его не шлют. Однако сокет я рассоединяю же "вручную".
Код AS3:

sender.connected ? sender.close() : null;

И трейс кажет, что он не соединен в момент нового коннекта.
try-catch ничего не показал в трейсе.
Ей-ей - фантастика какая-то. Непонятно, что даже свежесозданный сокет ведет себя этак странно.

chamele0n 18.04.2013 22:37

какаето жуткая проверка
Код AS3:

if(sender && sender.connected) sender.close();

и попробуй чистить буфер после каждой отправкой
Код AS3:

sender.write.......
sender.flush();

а вообще сокеты отлично работают во флеше, обычно причиной является кривой код

MOHCTEP 18.04.2013 23:01

При наличии сокета, чистим листенеры и при этом если сокет в коннекте - принимаем меры. В чем жуть этой конкретной конструкции?
Буфер естественно чистится, однако, он-то здесь при чем?
Цитата:

а вообще сокеты отлично работают во флеше, обычно причиной является кривой код
Ну так укажите на эту кривизну, буду благодарен. Сентенции типа вашей цитаты, как-то не особо помогают.
Имеет ли значение, что это AIR проект? Судя по хелпу, вроде параллельно...


Часовой пояс GMT +4, время: 07:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.