Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Socket, склеенные пакеты (http://www.flasher.ru/forum/showthread.php?t=144529)

ekeeper 14.09.2010 16:43

Socket, склеенные пакеты
 
код для сокета использую из мануала - http://www.adobe.com/livedocs/flash/...xamplesSummary

при коннекте с серваком, последний сразу шлет клиенту 10 одинаковых пакетов.
А вот функция на событие SOCKET_DATA срабатывает только 2 раза - словно приходит 2 пакета.

Вот первый:
Код:

[ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 bytesLoaded=12 bytesTotal=0]
Вот второй:
Код:

[ProgressEvent type="socketData" bubbles=false cancelable=false eventPhase=2 bytesLoaded=108 bytesTotal=0]
почему так сильно размеры отличаются? такое чувство, что оставшиеся 9 (12*9=108 байт) пакетов пришли как один...

Если сервер отправляет пакеты с некоторой задержкой - все ок. Если вот сразу кучей - вот такие проблемы.

Надо ставить микроскопическую задержку или какой-то разделитель? null например?

gloomyBrain 14.09.2010 16:46

А Вы flush на сервере после каждого сообщения вызываете?

Division 14.09.2010 16:47

В TCP/IP нет понятия пакета - это потоковый протокол. Пришло все как один вероятно из-за включенного алгоритма нейгла. Все что посылается может приходить абсолютно любыми порциями.
Так что отделять пакеты данных дело рук самого программиста.

ekeeper 14.09.2010 16:49

Цитата:

Сообщение от Division (Сообщение 935883)
Так что отделять пакеты данных дело рук самого программиста.

отделять на сервере при отправке или на клиенте?

Division 14.09.2010 16:54

Ну смотри. Представим такой пакет:
- Первый байт - id типа передаваемой сущности
- Потом два байта - размер последующих данных пакета
- сами данные

Алгоритм чтения такой.
Если получили три байта или более - читаем заголовок и размер, понимаем сколько байт нужно еще прочитать чтобы полностью составить пакет.
После того как пакет прочитан, передаем его кому-то на обработку и разгребаем следующие пришедшие данные.

ekeeper 14.09.2010 16:57

спасибо, будем пробовать

gloomyBrain 14.09.2010 17:04

Цитата:

В TCP/IP нет понятия пакета - это потоковый протокол
Эмм.. А как тогда гарантировать доставку...?

Вообще говоря TCP/IP - это несколько протоколов разного уровня. И как подсказывает Википедия - пакеты там все таки есть.
Другое дело, что как со стороны FP, так, зачастую, и со стороны сервера, мы работаем не с пакетами, а с порциями данных, которые могут состоять из нескольких пакетов

ekeeper 14.09.2010 17:13

Цитата:

Сообщение от gloomyBrain (Сообщение 935882)
А Вы flush на сервере после каждого сообщения вызываете?

Хоть сервак не мой, но походу нет. :)

gloomyBrain 14.09.2010 17:20

Когда вы пишете что-то в сокет - данные не отправляются сразу, они какое-то время висят в буфере.
flush очищает данные накопленные в буфере сокета. То есть, грубо говоря, выталкивает их - бегите, мол, ребята, на том конце провода вас ждут.
Если делать flush самостоятельно (не дожидаясь пока как-то все само отправится), то шансы на склейку сообщений стремительно падают.
Касательно алгоритма Нейгла - так ни разу с ним и не столкнулся, для меня это все еще миф =)

Division 14.09.2010 17:21

Да, я не правильно выразился. Это стек протоколов) Но суть в том что программист ни о каких пакетах в TCP/IP не ведает, а работает с потоком данных. Доставку гарантирует сам протокол, программисту для этого делать ничего не нужно.
Другое дело UDP - вот здесь отсылаются пакеты. Гарантия и порядок доставки ложится на программиста (в сетевых шутерах потери не критичны, так что предпочтительней UDP юзать для сетевого мочилова. TCP/IP будет упорно доставлять в том числе и устаревшие данные)


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

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