Как отправить несколько значений на веб-сервер одновременно [закрыто]


Моя проблема в том, что я отслеживаю местоположение пользователей в секунду, и это составляет 60 значений в массиве за минуту. Я написал простой php на своем сервере, чтобы сохранить данные в таблицу mysql. Из-за характера соединения (насколько я знаю) я могу сохранять запись за один запрос с помощью простого объекта httppost на стороне Android.(запрос выглядит так: xxx.com/writelocation.php?lat=33.76&lon=45.0&alt=12000) Я пытался решить эту проблему с помощью asynctask, но это не сработало. Соединение медленное, а данные тяжелый.Для завершения подключения требуется больше секунды, и каждую секунду появляется новая запись.Я ищу способ отправлять несколько значений одновременно, каждую минуту или около того.До сих пор я не мог найти другого решения, кроме использования прямого доступа к удаленной базе данных. Но мой хостинг не предоставляет удаленного доступа к моей базе данных mysql.

Мне нужно умное и дешевое решение моей проблемы:) что вы предлагаете? использует только удаленную базу данных (с помощью хостинга базы данных) решение?

Заранее благодарю.

Author: tekin beyaz, 2012-11-29

4 answers

Кодирование Json выполняется очень быстро, а потребление полосы пропускания действительно невелико. Я предлагаю вам использовать json для отправки этих данных, а затем проанализировать json на стороне сервера и вставить данные в базу данных.

Чтобы узнать больше о json в Android, см. http://www.vogella.com/articles/AndroidJSON/article.html

О чем вы думаете?

 2
Author: Miloš, 2012-11-29 13:49:31

PHP

С помощью PHP можно построить многомерный массив POST/GET следующим образом:

(Предположим, что это часть строки запроса)
id[]=1&id[]=2&id[]=3

Производит:

array(1) {
   "ID" => array(3) {
       [1] => string(1) "1"
       [2] => string(1) "2"
       [3] => string(1) "3"
   }
}

Аналогично, если вы заключите текст в квадратные скобки, вы можете использовать функциональность ассоциативного массива PHP:

form[fName]=John&form[lName]=Doe&form[age]=20

Производит

array(1) {
   "form" => array(3) {
       ["fName"] => string(4) "John"
       ["lName"] => string(3) "Doe"
       ["age"]   => string(2) "20"
   }
}

Излишне говорить, что это работает как с POST, так и с GET. Возможно, вы сможете использовать его в своем приложение, что-то вроде этого:

Loc1[lon]=долгота и loc1[широта]=широта и loc2[долгота]=долгота и loc2[широта]=широта

Таким образом, вы получаете:

array(2) {
   "loc1" => array(2) {
       "longitude" => string(9) "longitude"
       "latitude"  => string(8) "latitude"
   }
   "loc2" => array(2) {
       "longitude" => string(9) "longitude"
       "latitude"  => string(3) "latitude"
   }
}



MySQL

Просто примечание: Вместо выполнения нескольких запросов на вставку вы можете вставить все данные сразу и получить некоторые преимущества в скорости. например.

INSERT INTO `users` ( `fName`, `lName`, `age` ) VALUES ( "John", "Doe", "20" ),( "John", "Citizen", "42" )

В приведенном выше примере мы вставили две строки данных...

( "John", "Doe", "20" )
( "John", "Citizen", "20" )

Кроме того, убедитесь, что ваши данные правильно экранированы. Это может варьироваться в зависимости от используемого вами API базы данных.

 3
Author: Shane, 2012-11-29 14:23:59

Вместо ВСТАВКИ используйте ВСТАВКУ С ЗАДЕРЖКОЙ. кроме того, MySQL не является действительно масштабируемым решением для этого случая, возможно, лучше использовать MongoSQL для такого количества запросов. также вы можете сохранять запросы на сервере в виде текстового файла и запускать запросы в виде пакета каждые несколько секунд или минут

 2
Author: Saber Kordestanchi, 2012-11-29 13:51:13

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

Способ сделать это - локально буферизировать данные и отправлять их на сервер блоками. Например, соберите данные за десять минут и отправьте их все за один раз. Имейте в виду, что, помимо ограничения задержки в сети, которое вы уже обнаружили, установление, а затем разрыв соединений влечет за собой накладные расходы сети и увеличение срока службы батареи. Поэтому по многим причинам лучше, чтобы вы буферизовали данные локально и отправляли буфер через разумный интервал.

Каждый раз, когда вы отправляете данные на сервер, делайте это в рамках запроса POST. Это тот тип запроса, который следует использовать для отправки данных любого значительного размера, и это также означает, что данные могут быть зашифрованы с помощью TLS, если это потребуется вам позже.

 2
Author: Trevor, 2012-11-29 14:02:39