![]() |
Модераторы: javastic, AntonSaburov |
![]() ![]() ![]() |
|
vandaler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 5.11.2009 Репутация: нет Всего: нет |
Задача - принять строку от сервера, в которой хранится файл, где 5 первых символов - длина строчки с самим файлом, а дальше файл.
такой код виснет на последней строке. однако если считывать сообщение побайтно - все работает. помогите, в чем беда? |
|||
|
||||
W0LF |
|
||||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
ничего не понял, если честно, но проблема сокрее всего здесь -
мне кажется у тебя слишком большой size получается, и соответственно в потоке нет столько байт. но это если виснет. а вообще по идее вылетать должно. у тебя im должен быть инициализирован и под него уже должна быть выделена память, а он null, соответственно я бы твое зависание назвал ексепшином. доки читать надо!
-------------------- iOS developer |
||||
|
|||||
vandaler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 5.11.2009 Репутация: нет Всего: нет |
точно! спасибо. надо было инициализировать массив.
а вот я получил маччив байт im. мне нужно получить из него картнку. Image.createImage(im, 0, size) выдает исключение IllegalArgument. как правильно? |
|||
|
||||
W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
вот здесь находится документация по MIDP, так же она есть локально при установке WTK.
и в этой самой документации сказно -
IllegalArgumentException, если данные картинки имеют неправильный формат или же не могут быть декодированы -------------------- iOS developer |
|||
|
||||
vandaler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 5.11.2009 Репутация: нет Всего: нет |
ага, разобрался. чтение файла из потока блоком оказалось ненадежным. картинка иногда приходит не вся. поэтому, наверное, надо в конец файла добавить какую-то уникальную полследовательность символов, и счиывать до нее. или есть лучшие способы?
|
|||
|
||||
W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
нет, если не использовать udp то картинка должна приходить полностью, есть так называемые тобой блоки, которые разрешают вычитать все доступные на данный момент данный из потока, но это не значит что картинка тебе пришла сразу вся, тебе нужно делать while пока ты не вычитаешь все данные, то есть так бы ты вычитывал по одному байту, что есть намного дольше, а так ты вычитываешь просто блоками, и поэтому тебе нужен внешний цикл, который проверит, все ли пришло.
я понимаю что вопросы будут и на эту тему, так что примерно так -
Это сообщение отредактировал(а) W0LF - 30.11.2009, 05:00 -------------------- iOS developer |
|||
|
||||
Dancer |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
size = is.available(); - это может вернуть 0, но это не будет означать, что мы всё уже приняли. Нельзя по этой вещи организовывать цикл. лучше смотреть на количество прочитанных байт i = is.read(im, 0, size); - как i у нас станет "-1", это и будет означать, что более уже читать нечего, и можно закругляться. А когда is.avaliable() возвращает 0, то можно вычитывать по 1 байту, пока не будет достаточно байт, для того чтобы считать их пачкой в массив. -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! ![]() |
|||
|
||||
vandaler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 5.11.2009 Репутация: нет Всего: нет |
-1 будет тогда разорвется соединение. правильно?
|
|||
|
||||
Dancer |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
да, при закрытии коннекшена будет -1. Или эксепшен, при разрыве соединения.
Это сообщение отредактировал(а) Dancer - 2.12.2009, 14:08 -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! ![]() |
|||
|
||||
W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
а я всегда порциями читал
и все было нормально, и быстрее Не, с тобой, Dancer, я никоим образом спорить не буду =) просто в j2se это точно всегда нормально работает, а в j2me не знаю... Это сообщение отредактировал(а) W0LF - 2.12.2009, 20:31 -------------------- iOS developer |
|||
|
||||
vandaler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 5.11.2009 Репутация: нет Всего: нет |
Dancer, так в том и дело, что у меня сокет не разрывается. когда он разрывался, я просто использовал createImage(InputStream).
А так разобрался. Благо размер файла не превышает 11 кб, сделал побайтовое чтение для надежности. На скорости не отразилось. Спасибо всем за помощь |
|||
|
||||
Dancer |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: 33 Всего: 37 |
vandaler, ну, да, мой косяк, я когда сначала написал, не особо посмотрел, на твой первый пост.
Но вот код, который привёл, он уже с учётом твоей специфики. (то есть, сокет не закрывается и мы знаем сколько байт нам нужно вычитать. по возможности читаем "куском", если нет, то побайтово) if(len == -1) - это на всякий так сказать случай, типа а вдруг. break; if(size == sizeOfFile) - а вот это уже твой случай, то есть мы прочитали столько байт, сколько хотели. break; W0LF, со мной то как раз стоит спорить ![]() Но с этим avaliable() были у меня неприятные моменты, то есть действительно приходил нуль, моделей не помню, но на многих мобилках такое наблюдалось. Поэтому, кто предупреждён - тот вооружён! ![]() -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! ![]() |
|||
|
||||
vandaler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 5.11.2009 Репутация: нет Всего: нет |
у меня ещё вопросец по поводу получения файла:
в одном потоке есть цикл, который постоянно запрашивает и получает файл (побайтово). как бы мне остановить этот процесс независимо от того, на какой стадии он находится? я пытался просто закрывать сокет, а в этом цикле ловить исключение и проверять от чего оно вылезло: если от моего закрытия, то все ок и алерт не вызывается. почему-то время от времени моя программа вылетает |
|||
|
||||
W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
Object.wait(), Object.notify(), Object.notifyAll();
снова повторюсь, есть пример с WTK, там в примере с сокетами как раз показывают как правильно остановить, приостановить и тп -------------------- iOS developer |
|||
|
||||
vandaler |
|
|||
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 5.11.2009 Репутация: нет Всего: нет |
спасибо, буду разбираться!
|
|||
|
||||
![]() ![]() ![]() |
FAQ раздела лежит здесь! |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |