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

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

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

Регистрация: Dec 2007
Сообщений: 69
По умолчанию Socket, алгоритм склеивания данных

Доброго времени суток!

Подскажите, пожалуйста, какой-нибудь грамотный алгоритм склеивания данных в сокете и как проверить при считывании данных из сокета их целостность (кусок это или полный пакет)

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

Регистрация: Jun 2008
Сообщений: 91
берешь байтовый массив рубаешь его на пакеты по сколько тебе нужно , в каждый пакет заносишь номер пакета и количество байт которые будут в этом пакете - и начинаешь отгружать.

Старый 01.02.2011, 14:20
XBEEN вне форума Посмотреть профиль Отправить личное сообщение для XBEEN Найти все сообщения от XBEEN
  № 3  
Ответить с цитированием
XBEEN

Регистрация: Dec 2007
Сообщений: 69
А есть хоть какой-нить наглядный примерчик? Так проще разобраться.

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

Регистрация: May 2003
Адрес: Tallinn
Сообщений: 3,182
в первом пакете на сервере запихиваешь байт или инт (смотря, что нужно), который будет показывать длину всего сообщения. И исходя из этого считаешь, полное сообщение пришло или нет
__________________
Flash Developer
Папа TDP4 Team Battle

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

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

По поводу примерчика - неужели так сложно сделать writeShort(длина массива данных) перед записью самих данных?
__________________
...вселенская грусть

Старый 01.02.2011, 14:49
avilov вне форума Посмотреть профиль Отправить личное сообщение для avilov Найти все сообщения от avilov
  № 6  
Ответить с цитированием
avilov

Регистрация: Jun 2008
Сообщений: 91
[quote=gloomyBrain;969510]А номер-то зачем? =)

вдруг какого то пакета нет после передачи , можно повторно запросить и указать какой пакет нужен

Старый 01.02.2011, 14:53
XBEEN вне форума Посмотреть профиль Отправить личное сообщение для XBEEN Найти все сообщения от XBEEN
  № 7  
Ответить с цитированием
XBEEN

Регистрация: Dec 2007
Сообщений: 69
Спасибо, принцип понял. А пример нужен для большей ясности...

Старый 01.02.2011, 14:55
avilov вне форума Посмотреть профиль Отправить личное сообщение для avilov Найти все сообщения от avilov
  № 8  
Ответить с цитированием
avilov

Регистрация: Jun 2008
Сообщений: 91
Цитата:
Сообщение от XBEEN Посмотреть сообщение
Спасибо, принцип понял. А пример нужен для большей ясности...
Это значит вы нечего не поняли !

Добавлено через 4 минуты
не изобретай велосипед , TCP/IP гарантирует передачу и целостность данных , он сам продублирует не хватающие пакеты

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

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Цитата:
Сообщение от XBEEN Посмотреть сообщение
Спасибо, принцип понял. А пример нужен для большей ясности...
Отдуши.
Код AS3:
package artshlagin.network 
{
	import flash.events.DataEvent;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.ProgressEvent;
	import flash.events.SampleDataEvent;
	import flash.events.SecurityErrorEvent;
	import flash.net.Socket;
	import flash.utils.ByteArray;
 
	/**
	 * ...
	 * @author Artem Shlagin
	 */
 
	[Event(name = "sampleData", type = "flash.events.SampleDataEvent")]
 
	public class BinarySocket extends Socket
	{
		/**
		 * Два байта выделять под заголовок (true) или один (false)
		 */
		public static var HEADER_BYTES_DOUBLE:Boolean = true;
 
		/**
		 * Два байта выделять под заголовок (true) или один (false)
		 */
		public static var MESSAGE_LENGTH_DOUBLE:Boolean = true;
 
 
		private var _responseByteArray:ByteArray;
		private var _messageLength:uint;
 
		/**
		 * Класс для обмена бинарными данными с сокет-сервером
		 * @param	host
		 * @param	port
		 */
		public function BinarySocket(host:String = null, port:int = 0) 
		{
			super(host, port);
			super.addEventListener(Event.CONNECT, onConnect);
 
			_messageLength = 0;
			_responseByteArray = new ByteArray();
		}
 
		public function send(packet:uint, message:ByteArray = null):void {
			HEADER_BYTES_DOUBLE ? super.writeShort(packet) : super.writeByte(packet);
			if (message) {
				var l:uint = message.length;
				MESSAGE_LENGTH_DOUBLE ? super.writeShort(l) : super.writeByte(l);
				super.writeBytes(message);
			}
			else MESSAGE_LENGTH_DOUBLE ? super.writeShort(0) : super.writeByte(0);
			super.flush();
		}
		private function onConnect(event:Event):void 
		{
			super.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);
		}
 
		protected function onSocketData(event:ProgressEvent):void 
		{
			var ba:uint;
			var headerBytes:uint = HEADER_BYTES_DOUBLE ? 2 : 1;
			var messageBytes:uint = MESSAGE_LENGTH_DOUBLE ? 2 : 1;
			do {
 
				ba = super.bytesAvailable;
				if (_messageLength > 0) { //reading message
					if (ba >= _messageLength) {
						super.readBytes(_responseByteArray, headerBytes, _messageLength);
						flushToClient();
					}
					else return; //reading only a full message, or wait
				}
				else{
					if (_responseByteArray.length >= headerBytes) { //header passed
						if (ba >= messageBytes) { //reading message length if can
							_messageLength = MESSAGE_LENGTH_DOUBLE ? super.readUnsignedShort() : super.readUnsignedByte();
							if (!_messageLength) flushToClient(); //if no message
						}
						else return; // or waiting to load full length
					}
 
					else { // if header is not passed - reading
						if (ba >= headerBytes) { //reading header if can
							super.readBytes(_responseByteArray, 0, headerBytes);
						}
						else return; //or waiting to load full header
					}
				}
 
			}
 
			while (super.bytesAvailable); //NOT ba, мы считывали байты после калькуляции ba
 
		}
 
		/**
		 * Отправляет данные клиенту
		 */
		protected function flushToClient():void {
			_messageLength = 0;
			var event:SampleDataEvent = new SampleDataEvent(SampleDataEvent.SAMPLE_DATA);
			_responseByteArray.position = 0;
			event.data = _responseByteArray;
			_responseByteArray = new ByteArray();
			super.dispatchEvent(event);
 
		}
 
	}
 
}

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

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

Однако, я могу захотеть отправить больше, чем влезает в пакет TCP, тогда мне становится нужно дописывать длину пакета в его начале
__________________
...вселенская грусть

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

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

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


 


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


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