Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.04.2013, 03:58
MOHCTEP вне форума Посмотреть профиль Отправить личное сообщение для MOHCTEP Найти все сообщения от MOHCTEP
  № 1  
Ответить с цитированием
MOHCTEP

Регистрация: Dec 2002
Адрес: Живу вот где-то
Сообщений: 493
По умолчанию Ошибки при пересоединении сокета.

Ситуация следующая. Есть список нескольких профилей, содержащих параметры коннектов к разного рода устройствам.
Есть класс, создающий и обслуживающий эти самые соединения (сокетные).
Код 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. Это безобразие диспатчится контроллеру и он командует загрузку следующего профиля. И теперь все следующие, после "ошибочного", соединения выдают эту же ошибку, хотя они исправны на деле. Пробовал полностью обновлять сокет, на каждом профиле, проблема осталась. Если же соединения исправны, то и единственный сокет нормально разруливает все данные.
Возможно ли как-то победить это?

Старый 18.04.2013, 14:44
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 2  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Там, по-моему, надо каждый раз создать новый экземпляр сокета.
__________________
мой пустой блог


Последний раз редактировалось iflamberg; 18.04.2013 в 14:54.
Старый 18.04.2013, 15:59
MOHCTEP вне форума Посмотреть профиль Отправить личное сообщение для MOHCTEP Найти все сообщения от MOHCTEP
  № 3  
Ответить с цитированием
MOHCTEP

Регистрация: Dec 2002
Адрес: Живу вот где-то
Сообщений: 493
Цитата:
Пробовал полностью обновлять сокет, на каждом профиле, проблема осталась.
Наверное недорассказал. Обновление и подразумевало - создание нового сокета, с предварительным уничтожением предыдущего. Вот вариант с обновлением.
Код 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;
		}
Не помогло.

Старый 18.04.2013, 16:12
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 4  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
Код 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 не меняется. Должно помочь, должно.
__________________
мой пустой блог

Старый 18.04.2013, 16:21
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 5  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Не совсем уверен, но поробуй остановить дальнейшую обработку события об ошибке после обработки его контроллером
Код AS3:
private function onIOErr(e:IOErrorEvent):void
{
e.PreventDefault();
ConnectNextSocket();
}

Старый 18.04.2013, 16:32
MOHCTEP вне форума Посмотреть профиль Отправить личное сообщение для MOHCTEP Найти все сообщения от MOHCTEP
  № 6  
Ответить с цитированием
MOHCTEP

Регистрация: Dec 2002
Адрес: Живу вот где-то
Сообщений: 493
2 iflamberg Все меняется. Процедура, как видите, возвращает свежий сокет. Он и становится сендером, для нового профиля. Для этого в "set profile" добавлено:
Код AS3:
//removeSenderSocket();
//sender = newSenderSocket();
Говорю ж - не спасло.
2 C4Grey )) Попробую, спасибо! Алогично конечно, но что-то не придумывается ничего.
Не спасло.
Складывается впечатление, что этот IOError, каким-то непостижимым образом кешируется и "считает", что все остальные профили гиблые.


Последний раз редактировалось MOHCTEP; 18.04.2013 в 16:46.
Старый 18.04.2013, 21:19
C4Grey вне форума Посмотреть профиль Отправить личное сообщение для C4Grey Найти все сообщения от C4Grey
  № 7  
Ответить с цитированием
C4Grey

Регистрация: May 2007
Сообщений: 181
Отправить сообщение для C4Grey с помощью ICQ Отправить сообщение для C4Grey с помощью Skype™
Возможно, стоит посмотреть нет ли какой-то ошибки при подключении:
Код AS3:
try
{
   socket.connect();
}
catch(e0:IOError)
{
}
catch(e1:SecurityError)
{
}
Да, и может стоит подключать следующий после обработки CLOSE предыдущего сокета?

Старый 18.04.2013, 22:13
MOHCTEP вне форума Посмотреть профиль Отправить личное сообщение для MOHCTEP Найти все сообщения от MOHCTEP
  № 8  
Ответить с цитированием
MOHCTEP

Регистрация: Dec 2002
Адрес: Живу вот где-то
Сообщений: 493
Что интересно, событие CLOSE не приходит. Видимо железки просто его не шлют. Однако сокет я рассоединяю же "вручную".
Код AS3:
sender.connected ? sender.close() : null;
И трейс кажет, что он не соединен в момент нового коннекта.
try-catch ничего не показал в трейсе.
Ей-ей - фантастика какая-то. Непонятно, что даже свежесозданный сокет ведет себя этак странно.

Старый 18.04.2013, 22:37
chamele0n вне форума Посмотреть профиль Отправить личное сообщение для chamele0n Посетить домашнюю страницу chamele0n Найти все сообщения от chamele0n
  № 9  
Ответить с цитированием
chamele0n
[+4 24.04.13]
[+4 20.04.13]

Регистрация: Feb 2013
Адрес: Seireitei
Сообщений: 176
какаето жуткая проверка
Код AS3:
if(sender && sender.connected) sender.close();
и попробуй чистить буфер после каждой отправкой
Код AS3:
sender.write.......
sender.flush();
а вообще сокеты отлично работают во флеше, обычно причиной является кривой код
__________________
Personal Page
$demo = $away3d + $bullet + $pathfinding;

Старый 18.04.2013, 23:01
MOHCTEP вне форума Посмотреть профиль Отправить личное сообщение для MOHCTEP Найти все сообщения от MOHCTEP
  № 10  
Ответить с цитированием
MOHCTEP

Регистрация: Dec 2002
Адрес: Живу вот где-то
Сообщений: 493
При наличии сокета, чистим листенеры и при этом если сокет в коннекте - принимаем меры. В чем жуть этой конкретной конструкции?
Буфер естественно чистится, однако, он-то здесь при чем?
Цитата:
а вообще сокеты отлично работают во флеше, обычно причиной является кривой код
Ну так укажите на эту кривизну, буду благодарен. Сентенции типа вашей цитаты, как-то не особо помогают.
Имеет ли значение, что это AIR проект? Судя по хелпу, вроде параллельно...

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:54.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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