Как отправить несколько значений на веб-сервер одновременно [закрыто]
Моя проблема в том, что я отслеживаю местоположение пользователей в секунду, и это составляет 60 значений в массиве за минуту. Я написал простой php на своем сервере, чтобы сохранить данные в таблицу mysql. Из-за характера соединения (насколько я знаю) я могу сохранять запись за один запрос с помощью простого объекта httppost на стороне Android.(запрос выглядит так: xxx.com/writelocation.php?lat=33.76&lon=45.0&alt=12000) Я пытался решить эту проблему с помощью asynctask, но это не сработало. Соединение медленное, а данные тяжелый.Для завершения подключения требуется больше секунды, и каждую секунду появляется новая запись.Я ищу способ отправлять несколько значений одновременно, каждую минуту или около того.До сих пор я не мог найти другого решения, кроме использования прямого доступа к удаленной базе данных. Но мой хостинг не предоставляет удаленного доступа к моей базе данных mysql.
Мне нужно умное и дешевое решение моей проблемы:) что вы предлагаете? использует только удаленную базу данных (с помощью хостинга базы данных) решение?
Заранее благодарю.
4 answers
Кодирование Json выполняется очень быстро, а потребление полосы пропускания действительно невелико. Я предлагаю вам использовать json для отправки этих данных, а затем проанализировать json на стороне сервера и вставить данные в базу данных.
Чтобы узнать больше о json в Android, см. http://www.vogella.com/articles/AndroidJSON/article.html
О чем вы думаете?
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 базы данных.
Вместо ВСТАВКИ используйте ВСТАВКУ С ЗАДЕРЖКОЙ. кроме того, MySQL не является действительно масштабируемым решением для этого случая, возможно, лучше использовать MongoSQL для такого количества запросов. также вы можете сохранять запросы на сервере в виде текстового файла и запускать запросы в виде пакета каждые несколько секунд или минут
Попытка отправлять каждое новое местоположение каждую секунду является фундаментальным недостатком дизайна, и я бы рекомендовал избегать этой стратегии, потому что вы не можете гарантировать доступность сети и задержку с мобильного устройства.
Способ сделать это - локально буферизировать данные и отправлять их на сервер блоками. Например, соберите данные за десять минут и отправьте их все за один раз. Имейте в виду, что, помимо ограничения задержки в сети, которое вы уже обнаружили, установление, а затем разрыв соединений влечет за собой накладные расходы сети и увеличение срока службы батареи. Поэтому по многим причинам лучше, чтобы вы буферизовали данные локально и отправляли буфер через разумный интервал.
Каждый раз, когда вы отправляете данные на сервер, делайте это в рамках запроса POST. Это тот тип запроса, который следует использовать для отправки данных любого значительного размера, и это также означает, что данные могут быть зашифрованы с помощью TLS, если это потребуется вам позже.