Показать сообщение отдельно
Старый 13.02.2012, 22:30
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 5  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
Сообщение от VInchensoo Посмотреть сообщение
Но, во-первых, как-то странно, что пакет рвется, когда он имеет размер ~20 байт. Я понял бы, если 20кб, но не байт же.
У вас localhost и данные отправляются процессу сразу после того, как их положили в системный сокет. В Java-коде данные в системный сокет кладутся несколько раз. Вообще это плохо, но пока у вас код не заработает - наоборот, хорошо . 20Кб - это странное желание. В ethernet 100 обычно размер пакета не превышает 1,5 кб. На магистралях могут использоваться и технологии, где максимальный размер пакета - несколько десятков байт, так что все может быть.

Цитата:
Причем на сервер все приходит сразу, там такой ошибки нет, эксепшина не было ни разу за время тестов.
Если вы привели весь код, то вы не можете определить, "все" или "не все" приходит сразу. Все вызовы в java у вас - блокирующие. Если им не хватает данных, они ждут, пока не придет следующий фрагмент.


Цитата:
Вот этот момент я не особо понял. То, что я считываю- записано руками на сервере. Откуда данных будет больше? Это же не цпп с его низкоуровневой сетью, в bytesLoaded не должен учитываться заголовок пакета и прочий "системный трафик", который специфичен именно для реализации TCP.

Что вы подразумеваете под тем, что данных может быть больше?
Возможно, это я вас неправильно понял. Я думал, вы несколько раз одно и то же отправляете. И не все сообщения приходят. Если вы одно сообщение вычитать не можете - это другое. Да, кстати, в c++ вы тоже низкоуровеневые данные не увидите при использовании сокетов.

Цитата:
Другого способа(человечного) проверить, что данные пришли, и пришло именно столько, сколько нужно- я не нашел. Проверки на пустоту буфера я тоже не нашел.
Первое вы точно кроме как "вручную" не проверите. Проверка на пустоту - socket.available. Но это скажет только, что "пока еще данных нет."

Цитата:
Может вы можете подсказать, как это вся правильно организовать именно на флеше, может с какими-то пруфами\примерами кодов. Буду премного благодарен.
Попробуйте на каждой операции вычитывать весь socket.available байт в свой буфер. Если у вас не получается вычитать все данные, возможно, flash не отправляет socketData, если из сокета не было чтения (хотя бы одного байта). Свой буфер затем можно копировать целиком (или по частям) в ByteArray, и уже из него читать данные. Алгоритм примерно такой:
  1. Считать данные в свой буфер (byte[]).
  2. Проверить, достаточно ли данных в буфере для сообщения.
  3. Если данных не достаточно, выходим и ждем следующего события
  4. Если данных достаточно - копируем данные в ByteArray, оттуда разбираем данные. "Очищаем" буфер, отмечаем в буфере "свободное" место
Для начала буфер можно делать "сплошной" и после выборки из него сообщения сдвигать байты. Потом можно будет сделать кольцевой буфер, он чуть побыстрее будет (но и сложнее в реализации).