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

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

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

Регистрация: Apr 2011
Адрес: 0,0
Сообщений: 39
Отправить сообщение для cremnet с помощью Skype™
Question Потереные сообщения Socket

Есть Socket server, и клиент socket AS3 приложение. Проблема потери сообщений если сервер шлет в подряд более одного сообщения то клиент не получет второе а то и третье. если сообщения отралвлять с задержкой то сообщения доходят.
Если через telnet посылать эти же сообщения то все корректно доставляются хоть 2 это 20, ни одного не теряет.
Кто сталкивался с данным траблом?

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Сокет в ас3 читает данные до первого встреченного нуль-байта. Поищите по форуму, уже были подобные темы про склеивание сообщений
__________________
...вселенская грусть

Старый 05.05.2011, 22:01
cremnet вне форума Посмотреть профиль Отправить личное сообщение для cremnet Найти все сообщения от cremnet
  № 3  
Ответить с цитированием
cremnet

Регистрация: Apr 2011
Адрес: 0,0
Сообщений: 39
Отправить сообщение для cremnet с помощью Skype™
дык сообщение содержит \0 на конце
Проблема в том что если сообщения идут один за одним, он пропускает их. Примерная потеря 10% из отправленых сообщений

Добавлено через 9 минут
тему похожую нашел, но решения не понял http://www.flasher.ru/forum/showthre...ghlight=socket
кто поможет расжевать?

Добавлено через 25 минут
помогло добавлять два нуля вконце каждого сообщения
нифига... жаже два раза по \x00 не помогает... и \x00\x00\x00 не хочет... какимто волшебным образом 2ва раза получилось получить успешный результат... вобщем трабл пока не решен

Добавлено через 1 час 11 минут
похоже я сам себе отвечу:
Быть может весь трабл хранится сдесь http://www.javaspecialist.ru/2011/04/socket-api.html


Последний раз редактировалось cremnet; 05.05.2011 в 22:36.
Старый 06.05.2011, 00:05
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Сокет в ас3 читает данные до первого встреченного нуль-байта.
Это если используется XMLSocket.

Старый 06.05.2011, 00:28
cremnet вне форума Посмотреть профиль Отправить личное сообщение для cremnet Найти все сообщения от cremnet
  № 5  
Ответить с цитированием
cremnet

Регистрация: Apr 2011
Адрес: 0,0
Сообщений: 39
Отправить сообщение для cremnet с помощью Skype™
я запутался в конец,... исходя из выше упомянутой статьи нужно ставить схему запрос->ответ. Как бы все становитсяпонятно, если мы отправили сообщение, и оно не было получено, то отправляем его вновь. Получается мы на запрос делаем ответ на ответ - ответ? мой мозг рекурсирует, я завис

Добавлено через 7 минут
вот ситуация, конкретно которая у меня:
1 К серверу подключается 2ва сокета (гладко).
2 Один сокет создает виртуальную группу (ок).
3 Второй сокет запрашивает подключение к виртуальной группе, в ответ на это ему приходит 2ва сообщения
- в группе новый сокет (приходит на все сокеты в группе) (приходит без проблем
- подключение к виртуальной группе установлено (!сообщение сервером высылается, но до сокета не доходит)

Старый 06.05.2011, 00:47
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 6  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Есть предположение, что вы считываете содержание в строку, и потом эту строку в trace() - так да, вы увидете только до первого нуль-байта. Но вообще, ну, по крайней мере в теории TCP не должен терять пакеты. Разве что провод сетевой перерезать
__________________
Hell is the possibility of sanity

Старый 06.05.2011, 01:13
cremnet вне форума Посмотреть профиль Отправить личное сообщение для cremnet Найти все сообщения от cremnet
  № 7  
Ответить с цитированием
cremnet

Регистрация: Apr 2011
Адрес: 0,0
Сообщений: 39
Отправить сообщение для cremnet с помощью Skype™
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Есть предположение, что вы считываете содержание в строку, и потом эту строку в trace() - так да, вы увидете только до первого нуль-байта. Но вообще, ну, по крайней мере в теории TCP не должен терять пакеты. Разве что провод сетевой перерезать
ХЗ...
Код AS3:
		private function connectToServer(host:String,port:int):void{
			Security.loadPolicyFile("xmlsocket://"+host+':'+port);
			if (host && port)  
			{
				socket.connect(host, port);
			} else return;
 
			socket.addEventListener(Event.CLOSE, closeHandler);	 
			socket.addEventListener(Event.CONNECT, connectHandler);
			socket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
			socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
			socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); 
 
		}
		private function readResponse() : void {
 
			var str:String = socket.readUTFBytes(socket.bytesAvailable);
			trace(str);
                }
		private function sendRequest(str:String) : void {
			writeln(str);
			socket.flush();
		}
 
		private function writeln(str:String) : void {
			try 
			{
				socket.writeUTFBytes(str);
			}
			catch (e:IOError) 
			{
				trace(e);
			}
		}
		private function socketDataHandler(event : ProgressEvent) : void {
			trace('ProgressEvent');
			readResponse();
		}
Добавлено через 13 минут
доработал функцию readResponse чтобы проверить есть ли что нибудь после нуля
Код AS3:
		private function readResponse() : void {
 
			var str:String = socket.readUTFBytes(socket.bytesAvailable);
			trace(str,'-str');
			var str2:String = socket.readUTFBytes(socket.bytesAvailable);
			trace(str2,'-str2');
                }
Там пусто. И ваще не логично чтобы два сообщения шли в одном.
Данный сокет сервер устрое так что собщения отправляются из разных мест (классы)
Класс состояния группы слушает события в группе и на них реагирует (сокет вошел, сокет ушел.... и тд)
Класс контроллер проверяет можно ли пользователю в группу и логинет его туда(если можно) и выдает соответствующий ответ успешно или нет

Добавлено через 19 минут
Цитата:
Сообщение от etc Посмотреть сообщение
Это если используется XMLSocket.
flash.net.Socket


Последний раз редактировалось cremnet; 06.05.2011 в 01:30.
Старый 06.05.2011, 01:44
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 8  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
> Там пусто. И ваще не логично чтобы два сообщения шли в одном.
О каких сообщениях речь? Вы не получаете сообщения, вы получаете пакеты (сколько-то одновременно). От того сколько вы записали в сокет за один раз вдруг пропускная способность не поменяется... Более того, принимающая сторона понятия не имеет где / когда у вас наступает конец "сообщения".
Считайте сначала в ByteArray, потом byteArray.toString().split("\x00") - и посмотрите, что пришло. Так удобнее. try-catch при записи в сокет - не знаю зачем он вам... лучше сами проверьте подключен или нет. А еще лучше - ничего не ловите, пусть лучше словит тот, кто ломился писать в закрытый сокет.
__________________
Hell is the possibility of sanity

Старый 06.05.2011, 01:53
cremnet вне форума Посмотреть профиль Отправить личное сообщение для cremnet Найти все сообщения от cremnet
  № 9  
Ответить с цитированием
cremnet

Регистрация: Apr 2011
Адрес: 0,0
Сообщений: 39
Отправить сообщение для cremnet с помощью Skype™
Цитата:
Сообщение от wvxvw Посмотреть сообщение
> Там пусто. И ваще не логично чтобы два сообщения шли в одном.
О каких сообщениях речь? Вы не получаете сообщения, вы получаете пакеты (сколько-то одновременно). От того сколько вы записали в сокет за один раз вдруг пропускная способность не поменяется... Более того, принимающая сторона понятия не имеет где / когда у вас наступает конец "сообщения".
Считайте сначала в ByteArray, потом byteArray.toString().split("\x00") - и посмотрите, что пришло. Так удобнее. try-catch при записи в сокет - не знаю зачем он вам... лучше сами проверьте подключен или нет. А еще лучше - ничего не ловите, пусть лучше словит тот, кто ломился писать в закрытый сокет.
я как собака, все понимаю но сказать не могу... я на флеше без пяти минут месяц пишу

Старый 06.05.2011, 03:14
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
http://en.wikipedia.org/wiki/Maximum_segment_size
Ну вот а теперь представьте худший вариант, вы посылаете пакеты минимально приемлимой длины: 536 байтов. Для одного текстового сообщения этого скорее всего будет более чем достаточно. (В Виндовс обычно сокет отркытый на локальной машине и общающийся с локальным же сокетом будет посылать ~4 килобайта за раз, но, как видно из статьи нету никаких специальных ограничений). Но когда вы посылаете несколько сообщений, то они будут соответственно складываться в поток, естесственным образом так, как вы их и записали, и получать их сокет будет по пакетам, а не по сообщениям. Он может получать их "по сообщениям" если интервал между записью сообщений достаточно большой, чтобы получить первое сообщение до того, как отправится второе - но этого бессмысленно добиваться даже в локальной сети / на одной машине = медленно. Лучше записывать либо сумму байтов сообщения, либо байт / последовательность байтов которые сигналят получение полного сообщения, либо данные должны иметь формат, который сам однозначно определяет длину сообщения.
__________________
Hell is the possibility of sanity

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

Теги
lost , message , socket , потерянеря , сообщения
Опции темы
Опции просмотра

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

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


 


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


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