Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> несколько раз использовать HttpConnection, как зделать? 
V
    Опции темы
DEMOVERSION
Дата 8.3.2006, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 18.10.2005

Репутация: нет
Всего: 1



Скажите пожалуйста как зделать такое:
- создать коннекшин г веб-серверу
- несколько раз его использовать, тоесть несколько раз передать-получить даные?
Спасибо
PM MAIL   Вверх
W0LF
Дата 8.3.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Ну я так делал:

Код

ContentConnection c = null;
DataInputStream is = null;
byte[] data;
try {
  c = (ContentConnection)Connector.open(URL);
  is = c.openDataInputStream();
  int len = (int)c.getLength();
  if (len > 0) {
    data = new byte[len];
    is.readFully(data);
  } else {
     int ch;
     while ((ch = is.read()) != -1) {
      .....
     }
  }
   if(data != null)
     try{       
       image = Image.createImage(data,0,data.length);      
     }catch(Exception e){
     }
}catch(java.io.IOException ioe){
}
cattch(java.lang.NullPointerException npe){
}
finally{
  try{
    if(is != null) is.close();
    if(c != null) c.close();
  }catch(Exception e){
  }
  is = null;
  c = null;
}


Код может и не сильно хороший, но времени не много было, чтоб лучше написать.
А потом каждый раз нужно будет создавать новый коннекшн, ну или запихать эт все в отдельный класс(например ServerConnection) или метод и передавать тока URL, плюс сделать нормальную генерацию всех исключений, и отлавливать их выше.

Это сообщение отредактировал(а) W0LF - 8.3.2006, 16:25


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Cyr
Дата 20.3.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



W0LF,
А как несколько раз использовать метод POST?
И ещё, у меня следующая функция работает на эмуляторе WTK22, а на телефоне NOKIA 6230i - нет...
Код

 void postViaHttpConnection(String url, String post) throws IOException {
        HttpConnection c = null;
        InputStream is = null;
        OutputStream os = null;
        int rc;

        try {
            c = (HttpConnection)Connector.open(url);

            // Set the request method and headers
            c.setRequestMethod(HttpConnection.POST);
            c.setRequestProperty("User-Agent",
                "Profile/MIDP-2.0 Configuration/CLDC-1.0");
            c.setRequestProperty("Content-Language", "en-US");
            // Getting the output stream may flush the headers
            os = c.openOutputStream();
            os.write(post.getBytes());
            //os.flush();           // Optional, getResponseCode will flush

            // Getting the response code will open the connection,
            // send the request, and read the HTTP response headers.
            // The headers are stored until requested.
            rc = c.getResponseCode();
            if (rc != HttpConnection.HTTP_OK) {
                throw new IOException("HTTP response code: " + rc);
            }
            is = c.openInputStream();
            // Get the ContentType
            String type = c.getType();
            System.out.print(type); 
            // Get the length and process the data
            int len = (int)c.getLength();
            if (len > 0) {
                 int actual = 0;
                 int bytesread = 0 ;
                 byte[] data = new byte[len];
                 while ((bytesread != len) && (actual != -1)) {
                    actual = is.read(data, bytesread, len - bytesread);
                    bytesread += actual;
                 }
            //    process(data);
            } else {
                int ch;
                while ((ch = is.read()) != -1) {
                  
        if (ch>127) {
            ch = is.read();
            str=str+utf8(ch);
            }
        else if (ch<33) {str=str+(char)ch;}
                }
            }
        } catch (ClassCastException e) {
            throw new IllegalArgumentException("Not an HTTP URL");
        } finally {
            if (is != null)
                is.close();
            if (os != null)
                os.close();
            if (c != null)
                c.close();
        }
    }



PM MAIL   Вверх
redrick
Дата 20.3.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 1
Всего: 5



практика показывает, что даже если делать connection.close(), то GPRS соединение(или как данное соединение грамотно обозвать) живет некоторое время - т.е. AMS не закрывает его, таким образом 2 подряд поста проходят достаточно быстро


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
W0LF
Дата 20.3.2006, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Да, так оно и есть!


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Cyr
Дата 21.3.2006, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



И как решить проблемму?
Мне нужно сделать 2 POSTа:
В первом "посте" передаётся пароль и логин, а во втором - новый тарифный план.
А может где-нить есть исходники аналогичной реально работающей программы?

Это сообщение отредактировал(а) Cyr - 21.3.2006, 08:56
PM MAIL   Вверх
redrick
Дата 29.3.2006, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 1
Всего: 5



Cyr, да просто засылай подряд, в чем проблема то ?


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Cyr
Дата 29.3.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.3.2006

Репутация: нет
Всего: нет



redrick,
в том, что не работает.
На экран ничего не выводит, хотя на эмуляторе всё выводит.
PM MAIL   Вверх
redrick
Дата 29.3.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 1
Всего: 5



ну тут сложно попасть пальцем в небо... показывай код
из известных мне граблей - убери вызов flush()


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
javastic
Дата 30.3.2006, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



Cyr, просто вызывай свой метод два раза и не забудь в заголовке прописать Content-Length и его длинна должна соответствовать длинне POST запроса.


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
nagliyvred
Дата 9.5.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 2.10.2005

Репутация: 3
Всего: 3



Похожая проблема.. Есть некий сервер www.server.com. Мобильный клиент постоянно обращается к нему с запросами www.server.com/request.php?param1=value&param2=blablabla через HttpConnection через определенные промежутки времени. Мне бы хотелось не разрывать соедининие с серваком каждый раз, т.к. напрягает и сервер и телефон. Слышал что это можно сделать с помощью request property "Keep-Alive" но конкретного примера не нашел, а методом тыка пока никак не получается. Если кто может привести пример рабочего кода, был бы очень признателен. 
PM   Вверх
javastic
Дата 10.5.2006, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



nagliyvred, соединение GPRS не разрывается пока ты не выйдешь из мидлета.
 


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
nagliyvred
Дата 11.5.2006, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 2.10.2005

Репутация: 3
Всего: 3



Да дело не в этом. Допустим у меня есть код:
Код

public void run()
{
///blablabla
 while (smthn)
{
try
{
        http = (HttpConnection) Connector.open(currentAction);
                                
        int code = http.getResponseCode();
                                
        if (code == 200)
        {
                in = http.openInputStream();
                                    
                StringBuffer sb = new StringBuffer();
                                    
                int ch;
                while ((ch = in.read()) != -1) 
                         sb.append((char)ch);
                                    
                answer = sb.toString().trim();
          }
}
catch (Exception e)
{
           //#if debug == "true"
                   e.printStackTrace();    
           //#endif
}
finally

//closing connection here
}
//blablabla
}
//blablabla
}


т.е. на каждой итерации соединение создается (Connector.open()), считывается и разрывается. я хочу сделать нечто вроде:
Код

                                if (http == null || !lastAction.equals(currentAction))
                                {
                                    try
                                    {
                                        if (http != null) 
                                            http.close();
                                        System.out.println("##CLOSING CONNECTION##");
                                    }
                                    catch (Exception e) { }


                                    http = (HttpConnection) Connector.open(currentAction);  
                                    
                                    http.setRequestProperty("Connection", "Keep-Alive"); 
                                    System.out.println("%%OPENING CONNECTION%%  "+currentAction);
                                }
                                
                                if (http.getResponseCode() == HttpConnection.HTTP_OK) // code 200
                                {
                                    if (in != null && out == null)
                                    {
                                        out = http.openDataOutputStream();
                                        System.out.println("request = "+currentAction);
                                        out.write(currentAction.getBytes());
                                    }
                                    else if (out != null)
                                        out.flush();
                                    else
                                        in = http.openInputStream();
                                    InputStreamReader reader = new InputStreamReader(in);
                                    
                                    StringBuffer buf = new StringBuffer();
                                    int ch;
                                    while ((ch = reader.read()) != -1)
                                    {
                                        buf.append((char)ch);
                                    }
                                    answer = buf.toString().trim();
                                    connectionStartTime = System.currentTimeMillis();

                                }

Т.е не разрывать/создавать новое соединение без необходимости.  
PM   Вверх
javastic
Дата 11.5.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



Создавать соединение, а потом его закрывать - это и есть правильный принцип работы с передачей/приемом данных.

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

Код

int doPost(String a, String b, String c) {
// открываешь соединение
// передаешь текст запроса, например: 
// пусть a есть login=vasya , b есть pass=pupkin
// String request = "?" + a + "&" + b;
// считываешь код ответа
// закрываешь соединение
}


Далее вызывай метод сколько надо раз, например по таймеру.
И лучше не используй flush он на некоторых серверах глючит, один из признаков это "зависание" запроса.   

Это сообщение отредактировал(а) javastic - 11.5.2006, 10:08


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
redrick
Дата 11.5.2006, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

Репутация: 1
Всего: 5



такое замечание:

nagliyvred, когда соединение "разрывается" с точки зрения твоего мидлета, это всего лишь значит, что разрывается http соединение, однако TCP коннект остается (об этом заботится AMS). В http 1.1 все соединения именно такие "остающиеся" по умолчанию, т.е. TCP соединение между сервером и клиентом T(а это в нашем случае AMS) не разрывается. А вот http соединение - это по определение 1 запрос и 1 ответ, после этого оно закрывается всегда - такой протокол.

Надеюсь, прояснил что-то. 


--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
nagliyvred
Дата 11.5.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 2.10.2005

Репутация: 3
Всего: 3



Спасибо, многое прояснилось, но тем не менее... если http соединение "одноразовое", то что за request property  "keep-alive"? И вобщем-то это не решает мою проблему - а она в том что при постоянном созданиии соединения во первых быстро садится батарекйка, во вторых - серваку к которому я коннекчусь приходится каждый раз создавать новый сокет... 
PM   Вверх
satellite1977
Дата 25.9.2007, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 7.8.2007

Репутация: нет
Всего: нет



Здравствуйте. Я тоже не могу решить похожую проблему. Нужно передать на страницу логин и пароль методом POST, после этого на том, что откроется выбрать определенный параметр тоже методом POST (например, techplan=3).
Делаю первый запрос:
Код

public class Midlet extends MIDlet
{
    HttpsConnection HSC;
    InputStream IS;
    OutputStream OS;
    public void startApp() 
    {
            HSC = (HttpsConnection) Connector.open(URL);
            
            HSC.setRequestMethod(HttpsConnection.POST);
            HSC.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            HSC.setRequestProperty("Connection", "Keep-Alive");
      
            OS = HSC.openOutputStream();
        
             OS.write("login=xxxxxxx&password=xxxxxxx".getBytes());

После этого успешно попадаю на страницу (логин проходит).
А вот дальше не пойму - что сразу же делать второй запрос?
Если опять использовать OS.write(xxxxx) то логин не проходит, так как по всей видимости строка со второго write просто прибавляется к первой. Как сделать второй запрос именно после авторизации?
PM MAIL   Вверх
VOS
Дата 26.9.2007, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 31.1.2007

Репутация: 6
Всего: 8



Я столкнулся с тем, что такой код
 
Код

int len = (int)c.getLength();
  if (len > 0) {
   ....
}
 else {
while ((ch = is.read()) != -1)  
....
}
 

на некоторых телефонах не всегда работает корректно. Конкретно вот эта его часть:
while ((ch = is.read()) != -1)
Потому что если получаемые данные двоичные (в моем случае из-за шифрования), то в середине иногда встречался -1. Соответственно, часть данных терялась. Поэтому пришлось куда-то сохранять три последних байта, и если они все -1, то тогда считать, что это конец пакета. Как раз на Nokia была такая трабла.

В случае HTTP я сторонник все же варианта: подключился, отправил запрос, получил ответ, отключился. Web-сервер ориентирован на такую работу.  Этот механизм позволит ему обработать большое кол-во запросов клиентов. Иначе пара тысяч незакрытых соединений завесит его по-любому. Аналогия с сервером Oracle при работе в режиме выделенного или shared сервера. В случае выделенного на каждое подключение содается отдельный поток и с ним идет работа. Хорошо в случае десятков клиентов, в случае тысяч - беда, лучше юзать shared.
Тут создается конечный пул потоков и при новом подключении выбирается свободный, быстро проходит запрос и он освобождается для нового подключения. Естественно, запрос должен быть "небольшой", т.е. быстро обрабатываемым. В противном случае все зависнет еще быстрее, т.к.  пул конечный, забив все потоки остальные встанут  в очередь.

По поводу второго подключения после авторизации. Вариантов несколько. Типичный - это сохранение состояния на стороне сервера.  
Напимер в ASP для этого можно юзать объект Session. При подключении клиента и его авторизации в Session вписывается, например,  код клиента. В следующий раз при подключении смотрим если Session не пустой, то авторизация уже была проведена ок. 
Но для этого клиент должен поддерживать Cookies. 

Можно генерировать самостоятельно при авторизации какую-нибудь сессию (например GUID+IP клиента или типа того). И после авторизации отправлять ее клиенту. Соответсвенно в каждом запросе последующем ее надо передавать, дабы сервер по списку текущих сессий мог сразу понять, что авторизация уже проведена.

Ну и можно в каждом запросе передавать логин/пароль + данные, которые нужны в конкретном случае. Т.е. по любому сначала проводить идентификацию, аутентификацию и авторизацию, а потом уже обрабатывать собственно запрос.

Если где наврал - не со зла smile

Это сообщение отредактировал(а) VOS - 26.9.2007, 10:02
PM MAIL   Вверх
javastic
Дата 27.9.2007, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



Двоичные данные можно например кодировать в encode64


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
VOS
Дата 27.9.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 31.1.2007

Репутация: 6
Всего: 8



Согласен,  но трафик при этом растет.  В моем случае убедить, что это необходимые издержки производства не получилось. Удалось лишь убедить не сжимать пакет предварительно (и то удивляюсь).
PM MAIL   Вверх
javastic
Дата 28.9.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: 19
Всего: 27



Но согласись, что чем то всё равно придётся жертвовать. Идеального решения не получиться.

Добавлено через 7 минут и 24 секунды
Попробуй читать в буфер определённого размера, так должно 100% получиться. (без проверки на -1)


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
VOS
Дата 28.9.2007, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 31.1.2007

Репутация: 6
Всего: 8



Проблему-то я решил давно, просто заострил внимание на такой возможной ситуации. Может кто еще на те же грабли наступит. Но все равно спасибо за участие. 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.1441 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.