Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Гришка
1 / 1 / 0
Регистрация: 19.09.2011
Сообщений: 11
#1

Одновременные запросы с андроидов на сервер - Android

06.06.2014, 20:38. Просмотров 1029. Ответов 13
Метки нет (Все метки)

Есть несколько планшетов с андроидом и сервер на винде. С сервера передаются вопросы с вариантами ответов, а с планшетов на сервер передаётся номер ответа.
При одновременном нажатии кнопок на планшетах сервер получает номера одной строкой, что является ошибкой. При неодновременном нажатии (то есть только на одном планшете в одно время) такой проблемы нет.
Попробовал с сервера по очереди с задержкой давать планшетам разрешение на передачу, но возникла проблема.

Нажатие кнопки на планшете:

Java
1
2
3
4
5
6
7
8
9
10
11
...
  Log.d(LOG_TAG, "ALLOWED setOK " + ALLOWED);
    
  do
  {
      WrBool = proverka(); Здесь виснем, если ALLOWED == false
  }
  while (!WrBool);
 
    Log.d(LOG_TAG, "ALLOWED OK " + WrBool);
...
В функции proverka() читаем ALLOWED

Получение разрешения с сервера:
Java
1
2
3
4
5
6
...
      case '6': // опрос
          ALLOWED = true;
          Log.d(LOG_TAG, "ALLOWED 6 " + ALLOWED);
          set_timer3(); // устанавливает  ALLOWED в false с задержкой         
        break;
По идее в цикле do-while мы должны дождаться разрешения с сервера (ALLOWED = true), но если нажали кнопку при
ALLOWED == false, цикл глухо виснет. Что можно сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
07.06.2014, 06:52     Одновременные запросы с андроидов на сервер #2
Цитата Сообщение от Гришка Посмотреть сообщение
При одновременном нажатии кнопок на планшетах сервер получает номера одной строкой, что является ошибкой
это не является ошибкой. ошибкой является работа сервера который неспособен разобрать входящий поток. тем более что данные приходят от разных узлов. как они у вас сливаются в одну строку? какой протокол между сервером и узлом?
krapotkin
2147 / 2085 / 536
Регистрация: 14.04.2014
Сообщений: 10,105
07.06.2014, 09:33     Одновременные запросы с андроидов на сервер #3
действительно, что за протокол?
я вообще не могу представить, как написать сервер, у которого разные клиенты могут писать в один поток
Гришка
1 / 1 / 0
Регистрация: 19.09.2011
Сообщений: 11
07.06.2014, 20:19  [ТС]     Одновременные запросы с андроидов на сервер #4
На сервере стандартный ServerSocket из набора CPP builder 2010 в режиме NonBlocking. На андроидах - тоже их стандартный сокет
Java
1
2
3
...
connection = new Socket(Addr, listeningPort);
...
Специально протокол не определялся (да я и не нашёл, где это сделать), по умолчанию думаю, что http.
Всё это работает на порте 5556.

На стороне сервера в событии onClientRead читается текст S = Socket->ResiveText(); и адрес пославшего Adr = Socket->RemoteAddress. При одновременном посыле на сервере читается с одного адреса слившаяся строка с обоих планшетов, а с другого - пустая строка. Было бы неплохо их разделить. Я правда пошёл другим путём, возможно не правильным - разделить посылы по времени.
Вчерашнюю проблему с зависанием в бесконечном цикле с предполагаемом выходе по изменению переменной я решил - вообще отказался от цикла, т.к. андроидные дрова отдавали этому циклу всё процессорное время - не помогали ни перенос проверки в отдельный поток, ни в AsyncTask.

Но если подскажите, как разделить одновременно посылаемые данные на сервере, был бы благодарен.
krapotkin
2147 / 2085 / 536
Регистрация: 14.04.2014
Сообщений: 10,105
07.06.2014, 21:11     Одновременные запросы с андроидов на сервер #5
действительно был удивлен, т.к. я довольно много написал мини-HTTP серверов на delphi, и все очень просто -
с клиента идет обычный HTTP-запрос, и он обязательно попадает в отдельный поток HTTP-сервера
только запрос делается через HttpClient, а не устанавливается связь через Socket

примерно как тут
http://androidexample.com/How_To_Mak...aid=63&aaid=88
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
08.06.2014, 10:18     Одновременные запросы с андроидов на сервер #6
Цитата Сообщение от Гришка Посмотреть сообщение
по умолчанию думаю, что http
я думаю по умолчанию там вообще протокола нет - просто поток данных
Цитата Сообщение от Гришка Посмотреть сообщение
стороне сервера в событии onClientRead читается текст S = Socket->ResiveText(); и адрес пославшего Adr = Socket->RemoteAddress. При одновременном посыле на сервере читается с одного адреса слившаяся строка с обоих планшетов, а с другого - пустая строка.
вы же понимаете что это невозможно - события должно быть два для каждого пославшего. и в каждое событие пойдет свой текст. прям точно точно в один сливаются)? сейчас попробую)
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
08.06.2014, 11:27     Одновременные запросы с андроидов на сервер #7
как я и говорил все приходит раздельно
Миниатюры
Одновременные запросы с андроидов на сервер  
Вложения
Тип файла: rar client_server.rar (305.2 Кб, 7 просмотров)
Гришка
1 / 1 / 0
Регистрация: 19.09.2011
Сообщений: 11
08.06.2014, 23:20  [ТС]     Одновременные запросы с андроидов на сервер #8
Увы, пример неудачный. Он относится к серверу на андроиде (не понимаю, кому такое может прийти в голову). И к тому же это для интернета.
К моему случаю это не подходит - у меня сервер на винде, а клиенты (до 40) - на андр. планшетах - грубо говоря, учебный класс. И никакого инета нет - связь с сервером через wifi.

Добавлено через 27 минут
Уважаемый vxg, с одного клиента так было и у меня в ходе предварительных испытаний. НО! У меня другая проблема - посылы идут одновременно с нескольких клиентов, и причём на андроидных дровах (грубо говоря учебный класс, где ученики, сдавая экзамен, нажимают кнопки правильных ответов в произвольные моменты времени - до с 38 планшетов одновременно). При совпадении момента нажатия с разных дровяных планшетов и происходит эта неприятность, т.е. кранты, если не сказать правильнее. Этот учебный класс успешно продавался, но те планшеты, на которых это делалось и всё с ними работало, в продаже отсутствуют, и мы взяли похожие и тут начались обычные андроидные мерзости. А может, я чего не понял - андроид - не сырые дрова, а прекрасная система, а я тупой? Или америкосы тупорылые? Но мне как то надо вылезти из этой лажи.

Добавлено через 9 минут
Кстати, не помогла и работа с роутером - ни расширение потока чтения/записи, ни привязка мак-адресов к их ip.
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
09.06.2014, 07:48     Одновременные запросы с андроидов на сервер #9
Цитата Сообщение от Гришка Посмотреть сообщение
посылы идут одновременно с нескольких клиентов
в моем примере клиент то один, но сокетов два и при нажатии кнопки послать идет одновременный (одновременне дальше некуда) посыл через два сокета одинаковой строки. видно, что они попадают в разные вызовы обработчика как и должно быть. андроид и дрова тут не причем - планшет это узел сети и никаким способом он не может залезть в соединение чужой сетевой карты или даже в соседнее соединение своей сетевой карты. я продолжаю думать что все беды от сервера. возможно там специально было сделано "нечто" портящее вам нервы

Добавлено через 1 минуту
...скорее всего люди сделавшие сервер сливают все в одно место и какая то другая сущность разбирает это месиво каким-то образом умудряясь находить границы пакетов
krapotkin
2147 / 2085 / 536
Регистрация: 14.04.2014
Сообщений: 10,105
09.06.2014, 10:30     Одновременные запросы с андроидов на сервер #10
Цитата Сообщение от vxg Посмотреть сообщение
андроид и дрова тут не причем
+1,
за исключением "ни при чем" - раздельно
Гришка
1 / 1 / 0
Регистрация: 19.09.2011
Сообщений: 11
09.06.2014, 16:14  [ТС]     Одновременные запросы с андроидов на сервер #11
vxg, Ваш клиент прекрасно работает с моим сервером - команды с каждого сокета обрабатываются по отдельности, как и положено, хотя и с одного адреса. Но увы. У меня клиенты на андроиде и там нет winsock.h.

Так что проблема в андр.клиенте.
Попробовал поменять тип переменной при создании сокета (потоковый сокет) в
connection = new Socket(Addr, listeningPort);
Было String Addr, заменил на InetAddress Addr. Ошибки стали появляться гораздо реже.
Попробую дальше в этом же направлении, типа
new Socket(InetAddress dstAddress, int dstPort, InetAddress localAddress, int localPort)

Добавлено через 32 минуты
krapotkin
2147 / 2085 / 536
Регистрация: 14.04.2014
Сообщений: 10,105
09.06.2014, 16:19     Одновременные запросы с андроидов на сервер #12
да реализуйте уже HTTP сервер, не мучайтесь
клиент вызывает сервера по IP
http://192.168.0.100/?Stud="Иванов"&Question=5&Answer=1
idHTTPserver в OnGetCommand разбирает параметры и пишет в базу ОК/Ошибка
vxg
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
09.06.2014, 17:29     Одновременные запросы с андроидов на сервер #13
Цитата Сообщение от Гришка Посмотреть сообщение
У меня клиенты на андроиде и там нет winsock.h.
от этого принципы работы сети не меняются и клиенты не обретают сверхспособностей
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2014, 17:42     Одновременные запросы с андроидов на сервер
Еще ссылки по теме:

Запросы между сайтом и приложением Android
Android Получение данных с сервера, длинные запросы
Android Лимит на запросы в Google Maps Directions API
Android Групповые сетевые запросы с задержкой
Android Как сделать ajax запросы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Гришка
1 / 1 / 0
Регистрация: 19.09.2011
Сообщений: 11
17.06.2014, 17:42  [ТС]     Одновременные запросы с андроидов на сервер #14
Доброе время суток.
Вы были правы - виноват сервер, запросы суммировались не с разных адресов, а с каждого по отдельности.
Добавил серверу дополнительную разборку слипшихся команд и эта проблема приказала долго жить.
Спасибо за наводку.
Yandex
Объявления
17.06.2014, 17:42     Одновременные запросы с андроидов на сервер
Ответ Создать тему
Опции темы

Текущее время: 05:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru