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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.04.2012, 17:52
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 11  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
похоже сервер не правильно присылает, потому что я протрейсил длину массива и там очевидно не хватает байтов =)

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Ну, в общем-то там и не обязательно должны быть ВСЕ байты. Потому как по сети информация передается пакетами, размер которых определяется пройденными по пути маршрутизаторами.
То есть если Вам отправили 100 байт, это значит что вам может прийти:
- 2 по 50
- 1 по 100
- 2 по 25 + 1 по 50

Для того чтобы удостовериться в целостности сообщения, как правило, записывают длину сообщения в его первые 2 байта. А на принимающей стороне принимаем 2 байта, читаем их (получаем ожидаемую длину) и ждем пока придет столько, сколько указано в длине.
__________________
...вселенская грусть

Старый 18.04.2012, 18:46
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 13  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
у меня обмен идет через tcp соединение, а не через udp

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

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

Старый 19.04.2012, 00:45
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 15  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
да я уже поставил =) но поскольку косяк не с моей стороны я особо не стал заморачиваться, жду пока пацаны поправят серверсайд

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

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
gloomyBrain пишет именно про tcp, про Socket, как уже не раз писали, это поток (XMLSocket по-моему сам склеивает, использует 0 байт как разделитель как альтернативу "записывают длину сообщения в его первые 2 байта"). В udp по-моему как раз есть пакеты, т.е. отосланное не может побиться.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 19.04.2012, 12:58
anmelegov вне форума Посмотреть профиль Отправить личное сообщение для anmelegov Найти все сообщения от anmelegov
  № 17  
Ответить с цитированием
anmelegov
[+4 07.04.12]
[+1 20.01.12]

Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
TCP — это транспортный механизм, предоставляющий поток данных, с предварительной установкой соединения, за счёт этого дающий уверенность в достоверности получаемых данных, осуществляет повторный запрос данных в случае потери данных и устраняет дублирование при получении двух копий одного пакета (см. также T/TCP). В отличие от UDP гарантирует целостность передаваемых данных и уведомление отправителя о результатах передачи.
http://ru.wikipedia.org/wiki/TCP

Старый 19.04.2012, 14:00
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 18  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Но гарантий, что данные придут одним куском - нет. Ещё раз, интерфейс tcp socket - это поток. Что это может означать - gloomyBrain хорошо описал. Все нормальные сетевики это знают, спорить смысла нет, можно не верить, конечно)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

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

Короче, если разберетесь, то вот:
Код AS3:
package nq.net.connections.buffered {
 
	import flash.errors.IllegalOperationError;
	import flash.events.ProgressEvent;
	import flash.utils.ByteArray;
	import nq.net.connections.ASocketConnection;
 
	[Event(name = "bufferedSocketMessage", type = "nq.net.connections.buffered.SocketMessageEvent")]
 
	/**
	 * Буферизированное соединение с сокет-сервером
	 * 
	 * @author gloomybrain
	 */
	public final class BufferedSocketConnection extends ASocketConnection {
 
		private var _bytesLeft:uint = 0;
		private var _tempMessage:SocketMessage = null;
 
		private var _maxMessageSize:uint;
 
		/**
		 * @param	maxMessageSize	Максимальный размер сообщения в байтах
		 */
		public function BufferedSocketConnection(maxMessageSize:uint = 1500) {
 
			super();
 
			if (maxMessageSize > 0xFFFF - 1) throw new ArgumentError("Максимальная длина сообщения выходит за границы допустимого диапазона!");
			_maxMessageSize = maxMessageSize;
 
			super._socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
 
		}
 
		/**
		 * Отправить сообщение на сервер
		 * 
		 * @param	message
		 */
		public function send(message:SocketMessage):void {
 
			if (!message) throw new ArgumentError("Параметр должен быть не нулевым!");
			if (message.data && (message.data.length > _maxMessageSize)) throw new ArgumentError("Длина отправляемого сообщения превышает допустимый предел!");
 
			message.toBytes(super._socket);
			super._socket.flush();
 
		}
 
		private function onSocketData(event:ProgressEvent = null):void {
 
			if (!super._socket.connected) return;
 
			if (_bytesLeft == 0) {
 
				if (super._socket.bytesAvailable < 3) return;
 
				var bodyLength:uint = super._socket.readUnsignedShort();
				var bodyType:uint = super._socket.readUnsignedByte();
 
				if (bodyLength > _maxMessageSize) throw new IllegalOperationError("Длина принятого сообщения превышает допустимый предел!");
 
				_bytesLeft = bodyLength - 1;
 
				if (_bytesLeft != 0) {
 
					_tempMessage = new SocketMessage(bodyType, new ByteArray());
					return onSocketData();
				}
 
				super.dispatchEvent(new SocketMessageEvent(SocketMessageEvent.MESSAGE, new SocketMessage(bodyType)));
 
			}else {
 
				if (super._socket.bytesAvailable < _bytesLeft) return;
 
				super._socket.readBytes(_tempMessage.data, 0, _bytesLeft);
				super.dispatchEvent(new SocketMessageEvent(SocketMessageEvent.MESSAGE, _tempMessage));
 
				_bytesLeft = 0;
				_tempMessage = null;
 
				if (super._socket.bytesAvailable > 0) return onSocketData();
 
			}
 
		}
 
		/**
		 * Максимальный размер сообщения в байтах
		 */
		public function get maxMessageSize():uint {
			return _maxMessageSize;
		}
 
 
		/* INTERFACE nq.core.IDestroyable */
 
		/**
		 * @inheritDoc
		 */
		override public function destroy():void {
 
			_bytesLeft = 0;
			_tempMessage = null;
 
			super._socket.removeEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
 
			super.destroy();
		}
 
	}
 
}
__________________
...вселенская грусть


Последний раз редактировалось gloomyBrain; 19.04.2012 в 14:22.
Создать новую тему Ответ Часовой пояс GMT +4, время: 09:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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