Показать сообщение отдельно
Старый 15.02.2012, 20:47
VInchensoo вне форума Посмотреть профиль Отправить личное сообщение для VInchensoo Найти все сообщения от VInchensoo
  № 8  
Ответить с цитированием
VInchensoo

Регистрация: Jan 2012
Сообщений: 9
Цитата:
Угу. Размер пакета вычисляется неправильно на стороне сервера. Правильный размер 1 + 1 + (2 + 4 * 1) = 8 байт. Формат записи writeUTF описан в javadoc.
Вы немного не правы. В данном случае да, размер оказался 8 байт. Но это не всегда так. Например, если записать на форуме вместо "test" слово "тест", то каждый символ будет занимать уже по 2 байта, ибо это кириллица в юникоде. Вики пояснила это тем, что лишний байт для представления латиницы просто не используется, дабы не хавать лишнюю память. Снова не понятно, что делать, ибо реализация аналога sizeof монстроподобна.
Цитата:
А вообще порекомендую еще не руками вычислять размер "сообщения", а формировать сообщение и брать его размер.
Планировалось, что этим будет заниматься класс, в который я оберну работу с сокетом и буфером, поскольку быстро найти инфу по этому поводу не удалось, а желания копать не было=)
Цитата:
Учтите, что socket.read изменяет socket.available!
Да, это учитывалось, байт размера не учитывался.
Цитата:
И на будущее рекоменду в случае проблем трейсить также и все приходящие (считываемые) данные. Вы бы заметили, что пакет меньше, чем написано.
Учту на будущее.

Из-за двойного стандарта по строкам и символам вижу 2 пути:
1. Проверять, в каком диапазоне символ и, по результатам проверки, считать 1 или 2 байта.
2. Сделать или найти аналог функции sizeof из цпп и использовать его для того, чтобы записать размер строки в байтах. Тут придется привести к двухбайтовому числу этот самый размер(хотя это не проблема, на java точно).

Может что-нибудь посоветуете? Ибо получается слишком "обернутая обертка", простите за тавтологию, т.е. надстройка над надстройков.