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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SocketConnection http запросы, данные приходят только на первый запрос 
V
    Опции темы
copoka
Дата 18.6.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Устанавливаю SocketConnection
первый раз при отправке на сервер запроса ответ приходит (на мобильный эмулятор) как положено
второй запрос остается без ответа
третий раз вылетает ругань "java.io.IOException: IOError 10053 during socket:: write \n"
вот код класса который  устанавливает соединение и обрабатывает все запросы 
Код

    class HTTP implements Runnable {
        SocketConnection sc;
        OutputStream os;
        InputStream is;
        String message;
        public String str = null;
        public int met0d=100;
        public Displayable displayable;
        public boolean run=true;
        HTTP(){
            Thread t = new Thread( this );
            t.start();
        }
        public synchronized boolean send(String msg) {
            if (message == null){
                message = msg;
                notify();
                return true;
            }else{return false;}
        }
        public synchronized void run(){
            try {
                sc = (SocketConnection) Connector.open("socket://178.212.95.55:90");
                os = sc.openOutputStream();
                is = sc.openInputStream();
                int c;
                System.out.println("zapusk while v obekte p");
                while (run) {
                    while (message == null) {
                        System.out.println("p wait");
                        wait();
                    }
                    System.out.print("message="+message);
                    os.write(message.getBytes());
                    os.write("\r\n".getBytes());
                    System.out.println("prinimaem");
                    StringBuffer sb = new StringBuffer();
                    while ((c = is.read()) != -1) {
                        if (c == (char) 13 && (c = is.read()) == (char) 10 && (c = is.read()) == (char) 13 && (c = is.read()) == (char) 10) {
                            while ((c = is.read()) != -1) {
                                sb.append((char) c);
                            }
                        }
                    }
                    str = getString(sb.toString());
                    System.out.println("getString(sb.toString());="+str);
                    stringItem.setText(str);
                    message=null;
                }
            } catch (IOException ex) {ex.printStackTrace();
            } catch (InterruptedException ex) {ex.printStackTrace();}
        }
        public String getString(String s){...перекодировка кириллицы...}
    }

строка p = new HTTP(); записана в методе initialize()
в чем может быть проблема???


Подозреваю что неправильно вызываются методы sc.openOutputStream(), sc.openInputStream() возможно где то должны стоять close, reset, flush но так как на Java только вторую неделю работую немогу их правильно раставит.

Это сообщение отредактировал(а) copoka - 18.6.2010, 22:43
PM MAIL   Вверх
copoka
Дата 19.6.2010, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



добавил после os.write("\r\n".getBytes()); строку os.flush();
и
между внешним while (run) ... и внутренним while ((c = is.read()) != -1)... циклом добавил еще один
Код

do{
        while ((c = is.read()) != -1) {
            if (c == (char) 13 && (c = is.read()) == (char) 10 && (c = is.read()) == (char) 13 && (c = is.read()) == (char) 10) {
                while ((c = is.read()) != -1) {
                    sb.append((char) c);
                }
            }
        }
        try {Thread.sleep(500);} catch (InterruptedException ex) {ex.printStackTrace();}
}while(is.available()>0);


теперь второй ошибки "java.io.IOException: IOError 10053 during socket:: write \n" удалось избежать.
Осталась первая. Ответ получаю только на первый запрос. На последующие (.!..)-ответа нет.

Кто нибудь бывает на этом форуме? - сможет мне помочь?

Добавлено через 3 минуты и 3 секунды
с сервером точно все в порядке. Через Telnet на все запросы отвечает.
PM MAIL   Вверх
COVD
Дата 20.6.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Использование одного сокетного соединения для нескольких последовательных запросов стало возможно только в версии http1.1, но и это не гарантируется. Если сервер закрывает соединение после обслуживания запроса, то клиент для следующего запроса должен создать новое сокетное соединение. Используйте HttpURLConnection. Там это делается автоматически.   
PM MAIL   Вверх
copoka
Дата 20.6.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1)
Цитата(COVD @  20.6.2010,  16:27 Найти цитируемый пост)
Использование одного сокетного соединения для нескольких последовательных запросов стало возможно только в версии http1.1, но и это не гарантируется.


Я это уже понял. (Сегодня прочел "RFC 2068. Протокол передачи гипертекста -- HTTP/1.1". и провел серию дополнительных экспериментов через Telnet)

2)
Цитата(COVD @  20.6.2010,  16:27 Найти цитируемый пост)
Если сервер закрывает соединение после обслуживания запроса, то клиент для следующего запроса должен создать новое сокетное соединение. Используйте HttpURLConnection. Там это делается автоматически. 

В таком случае (как я понимаю) размер переданных и полученных данных (около 10 байт) будут округлятся до min 1kb в зависимости от оператора. А прога отсылает запросы каждые 5-10 сек и время ее работы от 1 до 8 часов.
Обсососу слишком жирно будет.

Сейчас пробую написать сервер на python который будет держать соединение и перенаправлять запросы.

PS По поводу второй части терзают сомнения. если это не так. поправьте меня чтоб я с python-ом не парился, а то J2Me и так уже мозг вынес, еще терь и python осваивать придется.

Это сообщение отредактировал(а) copoka - 20.6.2010, 17:45
PM MAIL   Вверх
COVD
Дата 20.6.2010, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Если надо передавать поток по HTTP, т.е. последовательность коротких сообщений , то это реализуют через "бесконечный" запрос-ответ. Если поток от клиента к серверу, то "бесконечный" запрос POST. Если поток от сервера к клиенту, то "бесконечный" ответ.    
PM MAIL   Вверх
copoka
Дата 20.6.2010, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как я понимаю речь идет про http заголовки.
Если так. То каким заголовком можно реализовать 
Цитата(COVD @  20.6.2010,  17:55 Найти цитируемый пост)
 "бесконечный" запрос-ответ.

Connection: keep-alive не дал результата

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

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



Код

Connection : close


Для того, чтобы это четко означало, что концом передаваемых данных служит закрытие соединения, в хедере не должно быть параметра Content-Length.

Если передающая сторона использует режим chunked (в http 1.1 обычно включается автоматически, если в OutputStream записано больше 1кб, т.е. больше одного пакета), то достаточно "никогда" не закрывать OutputStream.

Если реализация для мобильного клиента, то возможно лучше это обсудить в разделе Java ME. 
PM MAIL   Вверх
copoka
Дата 20.6.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Оказывается надо было в httpd.cfg  параметр KeepAlive в On установить
Код

GET /index.php?s=1&p=5655&ps=4654 HTTP/1.0
Host: 90.t4xi.org
Connection: keep-alive

и все работает

COVD спасибо за помощь
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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