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

. 20Кб - это странное желание. В ethernet 100 обычно размер пакета не превышает 1,5 кб. На магистралях могут использоваться и технологии, где максимальный размер пакета - несколько десятков байт, так что все может быть.
Цитата:
|
Причем на сервер все приходит сразу, там такой ошибки нет, эксепшина не было ни разу за время тестов.
|
Если вы привели весь код, то вы не можете определить, "все" или "не все" приходит сразу. Все вызовы в java у вас - блокирующие. Если им не хватает данных, они ждут, пока не придет следующий фрагмент.
Цитата:
Вот этот момент я не особо понял. То, что я считываю- записано руками на сервере. Откуда данных будет больше? Это же не цпп с его низкоуровневой сетью, в bytesLoaded не должен учитываться заголовок пакета и прочий "системный трафик", который специфичен именно для реализации TCP.
Что вы подразумеваете под тем, что данных может быть больше?
|
Возможно, это я вас неправильно понял. Я думал, вы несколько раз одно и то же отправляете. И не все сообщения приходят. Если вы одно сообщение вычитать не можете - это другое. Да, кстати, в c++ вы тоже низкоуровеневые данные не увидите при использовании сокетов.
Цитата:
|
Другого способа(человечного) проверить, что данные пришли, и пришло именно столько, сколько нужно- я не нашел. Проверки на пустоту буфера я тоже не нашел.
|
Первое вы точно кроме как "вручную" не проверите. Проверка на пустоту - socket.available. Но это скажет только, что "пока еще данных нет."
Цитата:
|
Может вы можете подсказать, как это вся правильно организовать именно на флеше, может с какими-то пруфами\примерами кодов. Буду премного благодарен.
|
Попробуйте на каждой операции вычитывать весь socket.available байт в свой буфер. Если у вас не получается вычитать все данные, возможно, flash не отправляет socketData, если из сокета не было чтения (хотя бы одного байта). Свой буфер затем можно копировать целиком (или по частям) в ByteArray, и уже из него читать данные. Алгоритм примерно такой:
- Считать данные в свой буфер (byte[]).
- Проверить, достаточно ли данных в буфере для сообщения.
- Если данных не достаточно, выходим и ждем следующего события
- Если данных достаточно - копируем данные в ByteArray, оттуда разбираем данные. "Очищаем" буфер, отмечаем в буфере "свободное" место
Для начала буфер можно делать "сплошной" и после выборки из него сообщения сдвигать байты. Потом можно будет сделать кольцевой буфер, он чуть побыстрее будет (но и сложнее в реализации).