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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Keep-Alive в SonyEricsson 
:(
    Опции темы
llex
Дата 6.12.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть некая онлайн игра. Изначально работающая на сокетах. Постоянная связь с сервером - необходима.
Возникла необходимость вместо сокетов использовать http.
И выяснилась такая вот неприятная вещь:
SE w900, k790, k850 ...  рвут tcp соединение после каждого запроса (windump на сервере ).
При этом сессия  вроде и поддерживается за счет кукис, но время обработки запроса слишком велико(даже при пинге и пустом ответе сервера).
Минимум 2.5 секунды, достаточно часто -  5-6 секунд, а иногда может  подвиснуть секунд на 15, в результате чего сервер выбрасывает игрока по таймауту.
Так же  довольно часто случается что пакеты с сервера вообще не доходят до клиента, что вообще как-то трудно объяснимо при нормальной работе http.
Тот же код на нокиях N95, N73 отрабатывает почти в 2 раза быстрее и tcp-соединение при этом не рвется.
Задал этот вопрос на developer.sonyericsson.com, но там как-то совсем глухо.
Может кто-то сталкивался с подобной проблемой?
Соединение обрабатывается в потоке:
Код

public void run() {
            DataOutputStream dos = null;
            DataInputStream dis = null;
            HttpConnection hc = null;
            String cookie = null;
            String mSession = null;
            long timeStart, timeDiff = 0;
            while (!stopped) {
                try {
                    timeStart = System.currentTimeMillis();
                    if (!commands.isEmpty()) {
                        hc = (HttpConnection) Connector.open(url, Connector.READ_WRITE);
                        hc.setRequestMethod(HttpConnection.POST);
                        hc.setRequestProperty("Content-Type", "application/octet-stream");
                        hc.setRequestProperty("connection", "Keep-Alive");
                        if (mSession != null) {
                            hc.setRequestProperty("Cookie", mSession);
                        }
                        dos = hc.openDataOutputStream();
                        // sending data
                        if (cookie == null) {
                            cookie = hc.getHeaderField("set-cookie");
                        }
//                      dos.flush()          //  не влияет
                        int rc = hc.getResponseCode();     // 
                        if (rc == HttpConnection.HTTP_OK) {
                            dis = hc.openDataInputStream();
                            if (cookie != null && mSession == null) {
                                int semicolon = cookie.indexOf(';');
                                mSession = cookie.substring(0, semicolon);
                            }
                            // recieving data...
                        } else if (rc == HttpConnection.HTTP_NO_CONTENT) {
                            // ...
                        } else if (rc == HttpConnection.HTTP_UNSUPPORTED_TYPE) {
                            // ...
                        }
                    }
                    timeDiff = System.currentTimeMillis() - timeStart;
                    if (timeDiff < httpTimeout) {
                        sleep(httpTimeout - timeDiff);
                    } else {
                        sleep(300);
                    }
                    yield();
                    if (dos != null) dos.close();
                    if (dis != null) dis.close();
//                    if (hc!=null) hc.close();      // не влияет
                } catch (Throwable e) {
                }
            }
        }

PM MAIL   Вверх
Antropoid
Дата 6.12.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 786
Регистрация: 1.6.2006
Где: &Ukraine==Ode ssa

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



Так одновременно создаются и tcp, и http соединения?


--------------------
user posted image
Задыхаясь от восторга заниматься чепухой. 
PM MAIL   Вверх
VOS
Дата 7.12.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня тоже были подобные заморочки с keep-alive на разных телефонах, но т.к. для меня на тот момент это был академический интерес, то плюнул на это дело.
Если Вы разрабатываете только под MIDP 2.0 может все же имеет смысл вернуться к использованию SocketConnection, но
запрос отправлять на 80 порт и в запросе формировать вручную все необходимые HTTP заголовки.
Грубо говоря через SocketConnection эмулировать HttpConnection.
Судя по всему сервер у Вас HTTP/1.1 поддерживает, иначе бы не работало и на Nokia, значит в таком режиме все должно быть ок.

При этом другие приложения, работающие с Вашим сервисом смогут работать по HTTP и проблем с проксями для них не будет 
(думаю Вы из-за этого хотите перейти на HTTP). 

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


Новичок



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

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



От сокетов мы никуда и не ушли, а скорее расширили возможности соединения.
На сервере работают одновременно и http и сокетные коннекторы, поэтому эмуляция вряд ли получится.
К тому же не уверенности что http коннектор развернут именно на 80 порту.
Поддержка http делается всязи с тем, что заказчик считает, что у какие-либо иностранные операторы могут не поддерживать сокетные соединения.
PM MAIL   Вверх
VOS
Дата 7.12.2007, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну порт не важен, это я так, для примера. 
И эмуляцию надо только на клиенте делать. 
Ну вообщем, опасения заказчика понятны. 
Думаю Вам будет полезно посмотреть реализации в интернет пэйджерах. ICQ, Jimm и т.д. для мобил.
Там они тоже Keep-Alive поддерживают.
Я как-то давно смотрел, вроде они через сокеты работали, но 100% уверенности нет.
PM MAIL   Вверх
llex
Дата 7.12.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не пробовал пэйджеры( скорее всего сокеты ), но попробовал несколько мобильных броузеров.
Результат тотже: nokia сессию держат, а se - рвут.
PM MAIL   Вверх
Sharkfire
Дата 11.12.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Jimm-е есть HTTP профиль подключения, и он держит связь, попробуйте посмотреть у них
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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