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

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

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

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

06.06.2014, 20:38. Просмотров 1061. Ответов 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, цикл глухо виснет. Что можно сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2014, 20:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Одновременные запросы с андроидов на сервер (Программирование Android):

Одновременные запросы - PHP БД
Всем привет! Скажите пожалуйста, если у меня сервер двухъядерный, это означает что он может обрабатывать два запроса одновременно? Если...

Bonpoc про одновременные запросы серверу - C++
Пару месяцев на зад я написал прогу, вспоминающую пароль методом грубого перебора. На моём не очень крутом компе + не самый шустрый инет...

Сервер-клиент, запросы - C#
И так, реализован сервер, есть клиент. Происходит подключение клиента к серверу, все ок. Как сделать так, что бы сервер посылал запрос...

Множественные запросы на сервер - Безопасность
Уважаемые специалисты и знатоки Windows XP! У меня возникли проблемы с посещением своего сайта. Сервер хостинг компании (ХП) блокирует...

Клиент-сервер запросы - C#
Помогите пожалуйста, может у кого-нибудь есть исходник. Хочу разобрать пример приложения в котором допустим при нажатии кнопки в...

Может ли сервер урезать запросы броузера? - Perl
Люди добрые, крик о помощи! Скоро свихнусь. Администратор хостинга ничего толком сказать не может, как в принципе и я тоже... Вот форма: ...

13
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,579
07.06.2014, 06:52 #2
Цитата Сообщение от Гришка Посмотреть сообщение
При одновременном нажатии кнопок на планшетах сервер получает номера одной строкой, что является ошибкой
это не является ошибкой. ошибкой является работа сервера который неспособен разобрать входящий поток. тем более что данные приходят от разных узлов. как они у вас сливаются в одну строку? какой протокол между сервером и узлом?
0
krapotkin
2598 / 2476 / 626
Регистрация: 14.04.2014
Сообщений: 11,990
Записей в блоге: 7
07.06.2014, 09:33 #3
действительно, что за протокол?
я вообще не могу представить, как написать сервер, у которого разные клиенты могут писать в один поток
0
Гришка
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.

Но если подскажите, как разделить одновременно посылаемые данные на сервере, был бы благодарен.
0
krapotkin
2598 / 2476 / 626
Регистрация: 14.04.2014
Сообщений: 11,990
Записей в блоге: 7
07.06.2014, 21:11 #5
действительно был удивлен, т.к. я довольно много написал мини-HTTP серверов на delphi, и все очень просто -
с клиента идет обычный HTTP-запрос, и он обязательно попадает в отдельный поток HTTP-сервера
только запрос делается через HttpClient, а не устанавливается связь через Socket

примерно как тут
http://androidexample.com/How_To_Mak...aid=63&aaid=88
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,579
08.06.2014, 10:18 #6
Цитата Сообщение от Гришка Посмотреть сообщение
по умолчанию думаю, что http
я думаю по умолчанию там вообще протокола нет - просто поток данных
Цитата Сообщение от Гришка Посмотреть сообщение
стороне сервера в событии onClientRead читается текст S = Socket->ResiveText(); и адрес пославшего Adr = Socket->RemoteAddress. При одновременном посыле на сервере читается с одного адреса слившаяся строка с обоих планшетов, а с другого - пустая строка.
вы же понимаете что это невозможно - события должно быть два для каждого пославшего. и в каждое событие пойдет свой текст. прям точно точно в один сливаются)? сейчас попробую)
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,579
08.06.2014, 11:27 #7
как я и говорил все приходит раздельно
0
Миниатюры
Одновременные запросы с андроидов на сервер  
Вложения
Тип файла: 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.
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,579
09.06.2014, 07:48 #9
Цитата Сообщение от Гришка Посмотреть сообщение
посылы идут одновременно с нескольких клиентов
в моем примере клиент то один, но сокетов два и при нажатии кнопки послать идет одновременный (одновременне дальше некуда) посыл через два сокета одинаковой строки. видно, что они попадают в разные вызовы обработчика как и должно быть. андроид и дрова тут не причем - планшет это узел сети и никаким способом он не может залезть в соединение чужой сетевой карты или даже в соседнее соединение своей сетевой карты. я продолжаю думать что все беды от сервера. возможно там специально было сделано "нечто" портящее вам нервы

Добавлено через 1 минуту
...скорее всего люди сделавшие сервер сливают все в одно место и какая то другая сущность разбирает это месиво каким-то образом умудряясь находить границы пакетов
0
krapotkin
2598 / 2476 / 626
Регистрация: 14.04.2014
Сообщений: 11,990
Записей в блоге: 7
09.06.2014, 10:30 #10
Цитата Сообщение от vxg Посмотреть сообщение
андроид и дрова тут не причем
+1,
за исключением "ни при чем" - раздельно
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 минуты
0
krapotkin
2598 / 2476 / 626
Регистрация: 14.04.2014
Сообщений: 11,990
Записей в блоге: 7
09.06.2014, 16:19 #12
да реализуйте уже HTTP сервер, не мучайтесь
клиент вызывает сервера по IP
http://192.168.0.100/?Stud="Иванов"&Question=5&Answer=1
idHTTPserver в OnGetCommand разбирает параметры и пишет в базу ОК/Ошибка
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,579
09.06.2014, 17:29 #13
Цитата Сообщение от Гришка Посмотреть сообщение
У меня клиенты на андроиде и там нет winsock.h.
от этого принципы работы сети не меняются и клиенты не обретают сверхспособностей
0
Гришка
1 / 1 / 0
Регистрация: 19.09.2011
Сообщений: 11
17.06.2014, 17:42  [ТС] #14
Доброе время суток.
Вы были правы - виноват сервер, запросы суммировались не с разных адресов, а с каждого по отдельности.
Добавил серверу дополнительную разборку слипшихся команд и эта проблема приказала долго жить.
Спасибо за наводку.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2014, 17:42
Привет! Вот еще темы с ответами:

Как отправить POST и GET запросы на сервер? - Delphi
Здравствуйте !!! Мне необходимо отправить 2 запроса на сервер: один POST, второй GET. Я использую TWebBrouser для отправки GET...

Сервер возвращает пустые страницы на запросы - C# ASP.NET
Доброго времени суток, all. Помогите, плиз, может кто сталкивался: Есть сайт, написанный на asp.net. Всё работает без сбоев, но как...

Не получается перенаправить запросы с роутера на сервер - Сетевое оборудование
Вообщем ситуация такая. У нас есть роутер, и подключенный к нему сервер. Какая стоит задача. Нам нужно чтобы при обращении к роутеру, по...

запросы в ms sql сервер, группировка даных - SQL Server
Помогите, пожалуйста, сделать запрос. У меня есть 4 таблицы: "вид продукції", "продукція", "облік виробництва", "відповідальний за...


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
17.06.2014, 17:42
Ответ Создать тему
Опции темы

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