|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
[+4 07.04.12]
[+1 20.01.12] Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
|
похоже сервер не правильно присылает, потому что я протрейсил длину массива и там очевидно не хватает байтов =)
|
|
|||||
Ну, в общем-то там и не обязательно должны быть ВСЕ байты. Потому как по сети информация передается пакетами, размер которых определяется пройденными по пути маршрутизаторами.
То есть если Вам отправили 100 байт, это значит что вам может прийти: - 2 по 50 - 1 по 100 - 2 по 25 + 1 по 50 Для того чтобы удостовериться в целостности сообщения, как правило, записывают длину сообщения в его первые 2 байта. А на принимающей стороне принимаем 2 байта, читаем их (получаем ожидаемую длину) и ждем пока придет столько, сколько указано в длине.
__________________
...вселенская грусть |
|
|||||
[+4 07.04.12]
[+1 20.01.12] Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
|
у меня обмен идет через tcp соединение, а не через udp
|
|
|||||
Modus ponens
|
Есть замечательная программа, практически обязательный инструмет любого веб-разработчика - Wireshark. :P Показывает всю возможную информации о том что и куда пересылалось по сети. А еще и бесплатно!
__________________
Hell is the possibility of sanity |
|
|||||
[+4 07.04.12]
[+1 20.01.12] Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
|
да я уже поставил =) но поскольку косяк не с моей стороны я особо не стал заморачиваться, жду пока пацаны поправят серверсайд
|
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
gloomyBrain пишет именно про tcp, про Socket, как уже не раз писали, это поток (XMLSocket по-моему сам склеивает, использует 0 байт как разделитель как альтернативу "записывают длину сообщения в его первые 2 байта"). В udp по-моему как раз есть пакеты, т.е. отосланное не может побиться.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
[+4 07.04.12]
[+1 20.01.12] Регистрация: Nov 2009
Адрес: Украина, Славутич
Сообщений: 263
|
TCP — это транспортный механизм, предоставляющий поток данных, с предварительной установкой соединения, за счёт этого дающий уверенность в достоверности получаемых данных, осуществляет повторный запрос данных в случае потери данных и устраняет дублирование при получении двух копий одного пакета (см. также T/TCP). В отличие от UDP гарантирует целостность передаваемых данных и уведомление отправителя о результатах передачи.
http://ru.wikipedia.org/wiki/TCP |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Но гарантий, что данные придут одним куском - нет. Ещё раз, интерфейс tcp socket - это поток. Что это может означать - gloomyBrain хорошо описал. Все нормальные сетевики это знают, спорить смысла нет, можно не верить, конечно)
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Цитата:
Короче, если разберетесь, то вот: 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. |
|
« Предыдущая тема | Следующая тема » |
|
|