Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 22.11.07 21:25
Оценка:
Как правильно работать в джаве с HttpConnection библиотеки java.io? Когда я пытаюсь подключиться к серверу программа зависает.
Зависает при попытке подключиться.
Короче вот листинг:
try {
HttpConnection conn = null;
InputStream is = null;
int rc;
conn = (HttpConnection)Connector.open("http://google.ru/"); //Вот тут она и подвисает
...
} catch(IOException ioe) {
...
}
Подключение так и не происходит
Re: Работа с HTTP в MIDP
От: Passer  
Дата: 23.11.07 05:19
Оценка:
Здравствуйте, UnConst, Вы писали:

UC>Как правильно работать в джаве с HttpConnection библиотеки java.io? Когда я пытаюсь подключиться к серверу программа зависает.

UC>Зависает при попытке подключиться.
UC>Короче вот листинг:
UC>try {
UC>HttpConnection conn = null;
UC>InputStream is = null;
UC>int rc;
UC>conn = (HttpConnection)Connector.open("http://google.ru/"); //Вот тут она и подвисает
UC>...
UC>} catch(IOException ioe) {
UC>...
UC>}
UC>Подключение так и не происходит

на чем это не работает. какой эмулятор или модель телефона
код правильный. и должен бы работать.
Re: Работа с HTTP в MIDP
От: Crypto Украина  
Дата: 23.11.07 12:16
Оценка:
Здравствуйте, UnConst, Вы писали:

UC>Как правильно работать в джаве с HttpConnection библиотеки java.io? Когда я пытаюсь подключиться к серверу программа зависает.

UC>Зависает при попытке подключиться.

Перенесите логику подключения в отдельный поток, т.к. я так понял, что у вас она работает в главном потоке.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 23.11.07 12:28
Оценка:
Здравствуйте, Passer, Вы писали:

P>на чем это не работает. какой эмулятор или модель телефона

P>код правильный. и должен бы работать.

Эмулятором я пользуюсь стандартым, с пакета j2mewtk2.2, который входит в JBuilder5. А телефон у меня Nokia6020.
Запрос на подключение появляется, но после подтверждения зависает. А в телефоне появляется ошибка Illegal State java/lang/IllegalStateException.
Re[2]: Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 23.11.07 12:31
Оценка:
Здравствуйте, Crypto, Вы писали:

C>Перенесите логику подключения в отдельный поток, т.к. я так понял, что у вас она работает в главном потоке.


С потоками, к сожалению не дружу. Вы не можете мне пример показать? Я пробовал функцию в отдельный поток перенести, но у я ее потом не смог ее запустить в программе, чего-то не хватало, видать...
Re[3]: Работа с HTTP в MIDP
От: Passer  
Дата: 23.11.07 12:56
Оценка:
Здравствуйте, UnConst, Вы писали:

UC>Здравствуйте, Passer, Вы писали:


P>>на чем это не работает. какой эмулятор или модель телефона

P>>код правильный. и должен бы работать.

UC>Эмулятором я пользуюсь стандартым, с пакета j2mewtk2.2, который входит в JBuilder5. А телефон у меня Nokia6020.

UC>Запрос на подключение появляется, но после подтверждения зависает. А в телефоне появляется ошибка Illegal State java/lang/IllegalStateException.

очень советую использовать sony erricson
а то так и замучатся не долго. под ним с сетевыми обрашениями проблем особых не бывает. на телефоне будет сложнее т.к. придется разбератся с настройками безопасности или подписывать мидлет.
Re[3]: Работа с HTTP в MIDP
От: Passer  
Дата: 23.11.07 13:03
Оценка:
Здравствуйте, UnConst, Вы писали:

UC>Здравствуйте, Crypto, Вы писали:


C>>Перенесите логику подключения в отдельный поток, т.к. я так понял, что у вас она работает в главном потоке.


UC>С потоками, к сожалению не дружу. Вы не можете мне пример показать? Я пробовал функцию в отдельный поток перенести, но у я ее потом не смог ее запустить в программе, чего-то не хватало, видать...


это не решит проблемы того что подключится не удается. зато вся прога при попытки подключится по http не будет зависать.

про потоки советую почитать доки.
коротко: создается клас реализуюший Runnable
при этом в классе должно быть метод run()
class NW implements Runnable{

public void run() {

}
}

в этом методе и описывается сто должно происхолить в отдельном потоке.
потом вызываем

NW nw=new NW()
new Thread(nw).start();

для того чтобы запустить отдельный поток
Re[4]: Работа с HTTP в MIDP
От: Crypto Украина  
Дата: 23.11.07 13:14
Оценка: +1
Здравствуйте, Passer, Вы писали:

P>это не решит проблемы того что подключится не удается. зато вся прога при попытки подключится по http не будет зависать.


Вы уверены? А как насчет того, что как раз SonyEricsson дедлочатся при попытке выполнить HttpConnection, FileConnection из обработчика команд?
Может у топикстартера и проблемы с настройками gprs, но отдельный поток здесь жизненно необходим.
Re[4]: Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 23.11.07 13:37
Оценка:
Здравствуйте, Passer, Вы писали:

P>очень советую использовать sony erricson

P>а то так и замучатся не долго. под ним с сетевыми обрашениями проблем особых не бывает. на телефоне будет сложнее т.к. придется разбератся с настройками безопасности или подписывать мидлет.

Зачем мне sony erricson? Мне нужно что бы программа работала на всех телефонах.
Re[5]: Работа с HTTP в MIDP
От: Passer  
Дата: 23.11.07 13:39
Оценка:
Здравствуйте, Crypto, Вы писали:

C>Здравствуйте, Passer, Вы писали:

C>Вы уверены? А как насчет того, что как раз SonyEricsson дедлочатся при попытке выполнить HttpConnection, FileConnection из обработчика команд?
C>Может у топикстартера и проблемы с настройками gprs, но отдельный поток здесь жизненно необходим.

чесно говоря я о таком не слыхал . писал не один проект под сониерксон. и не разу на этом не лочился.
хотя все возможно. если есть такой баг на сориериксон то стоилобы попробовать и такое. хотя мону подкинуть







а вот на этом можно проверить в чем проблема.

public class Game extends MIDlet {
    protected void startApp() throws MIDletStateChangeException {
        canva c = new canva();
        Display.getDisplay(this).setCurrent(c);
        System.out.println("11" + "2" + "3" + "4");


        try {
            System.out.println("1");
            HttpConnection hc = (HttpConnection) Connector.open("http://www.google.ru");
            InputStream is = hc.openInputStream();
            System.out.println("2");

            int ch;
            long len = hc.getLength();

            byte[] b = new byte[is.available()];
            is.read(b);

            c.s=new String(b);
            System.out.print(c.s);
            c.repaint();


            is.close();
            hc.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    protected void pauseApp() {
    }

    protected void destroyApp(boolean b) throws MIDletStateChangeException {

    }
}
class canva extends Canvas {
    public String s="";

    protected void paint(Graphics graphics) {
        graphics.setColor(255,255,255);
        graphics.fillRect(0,0,176,208);
        graphics.setColor(0);
        graphics.drawRect(10,10,100,100);
        graphics.drawString(s,1,1,Graphics.TOP | Graphics.LEFT);
    }

}
Re[4]: Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 23.11.07 13:39
Оценка:
В j2mewtk2.2 есть пример с HTTPConnection. Но он очень сложный. Разобраться в нем я так и не смог. И он работает без проблем на всем.
Re[5]: Работа с HTTP в MIDP
От: Passer  
Дата: 23.11.07 13:45
Оценка:
Здравствуйте, UnConst, Вы писали:

UC>Здравствуйте, Passer, Вы писали:


UC>Зачем мне sony erricson? Мне нужно что бы программа работала на всех телефонах.


а причем тут это?? в просто в эмуляторе SE намного беньше заморочек. а то для того что бы работало под все телефоны нужно не использовать специфические для определенных моделей классы. типо com.nokia.mid.ui.FullCanvas и т.д.
и все будет нормально.
я тоже писал под все модели. и писал именно на SE
Re[6]: Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 23.11.07 13:58
Оценка:
Здравствуйте, Passer, Вы писали:

P>а причем тут это?? в просто в эмуляторе SE намного беньше заморочек. а то для того что бы работало под все телефоны нужно не использовать специфические для определенных моделей классы. типо com.nokia.mid.ui.FullCanvas и т.д.

P>и все будет нормально.
P>я тоже писал под все модели. и писал именно на SE

Ну может быть его попробую. Только его у меня нет. И скачать варианта нет. Но в принципе я и этим доволен.

Сделал отдельным потоком подключение. Эмулятор не завис, зато теперь показывает то же самое что и мой телефон.
Re[6]: Работа с HTTP в MIDP
От: Donz Россия http://donz-ru.livejournal.com
Дата: 23.11.07 14:02
Оценка:
Здравствуйте, Passer, Вы писали:

P>а вот на этом можно проверить в чем проблема.

P>
P>public class Game extends MIDlet {
P>    protected void startApp() throws MIDletStateChangeException {
P>        canva c = new canva();
P>        Display.getDisplay(this).setCurrent(c);
P>        System.out.println("11" + "2" + "3" + "4");


P>        try {
P>            System.out.println("1");
P>            HttpConnection hc = (HttpConnection) Connector.open("http://www.google.ru");
P>            InputStream is = hc.openInputStream();
P>            System.out.println("2");

P>            int ch;
P>            long len = hc.getLength();

P>            byte[] b = new byte[is.available()];
P>            is.read(b);

P>            c.s=new String(b);
P>            System.out.print(c.s);
P>            c.repaint();


P>            is.close();
P>            hc.close();
P>        } catch (IOException e) {
P>            e.printStackTrace();
P>        }
P>    }
P>


Это неправильно. Есть модели, которые при выполнении системных callback методов более какого-то времени, просто вырубят мидлет. Как уже сказал Crypto, создавать свою нить для сетевого взаимодействия надо обязательно.
Re: Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 23.11.07 14:39
Оценка:
Все заработал. Понял в чем была причина.
Проблема была в том, что открыв сокет я не удосуживался начинать с него чтение. Поэтому он вис и возникала ошибка. Большое спасибо Passer. Его код очень помог.
Re[7]: Работа с HTTP в MIDP
От: Passer  
Дата: 23.11.07 15:07
Оценка:
Здравствуйте, Donz, Вы писали:


D>Это неправильно. Есть модели, которые при выполнении системных callback методов более какого-то времени, просто вырубят мидлет. Как уже сказал Crypto, создавать свою нить для сетевого взаимодействия надо обязательно.


я не спорю. но по моему данная проблема не от этого.
Re: Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 23.11.07 16:02
Оценка:
Возник еще вот какой вопрос. А как достучаться то до тех данных которые были получены в потоке?
Re[2]: Работа с HTTP в MIDP
От: Crypto Украина  
Дата: 23.11.07 16:24
Оценка:
Здравствуйте, UnConst, Вы писали:

UC>Возник еще вот какой вопрос. А как достучаться то до тех данных которые были получены в потоке?


Передать их из потока наружу
Например сделать listener. Вариантов много на самом деле.
Re[2]: Работа с HTTP в MIDP
От: Sash_net  
Дата: 23.11.07 16:25
Оценка:
Здравствуйте, UnConst, Вы писали:

UC>Возник еще вот какой вопрос. А как достучаться то до тех данных которые были получены в потоке?


Класс реализует Runnable для запуска как поток, но может содержать и свои методы получения данных


SomeRunnable sr = new SomeRunnable();
(new Thread(sr)).start();
...
data = sr.getReceivedData();
...
Re[3]: Работа с HTTP в MIDP
От: UnConst Россия  
Дата: 23.11.07 16:49
Оценка:
Здравствуйте, Sash_net, Вы писали:

S_>
S_>SomeRunnable sr = new SomeRunnable();
S_>(new Thread(sr)).start();
S_>...
S_>data = sr.getReceivedData();
S_>...
S_>


Это интересно конечно. Но как это использовать в данном примере? В какой библиотеке лежит этот класс? Где пишутся эти строки? И как мне в MainClass получить значение переменной result класса TreadClass? Во сколько сразу вопросов у меня возникло. Вы меня извините, в джаве я новичок.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.