如何一次将多个值发送到 Web 服务器 [关闭]

Posted

技术标签:

【中文标题】如何一次将多个值发送到 Web 服务器 [关闭]【英文标题】:How to send multiple values to a web server at once [closed] 【发布时间】:2012-11-17 14:37:01 【问题描述】:

我的问题是,我每秒跟踪用户的位置,它在一分钟内在一个数组中生成 60 个值。我在我的服务器中编写了一个简单的 php 来将数据保存到 mysql 表中。 由于连接的性质(据我所知),我可以在 android 端使用简单的 httppost 对象为每个请求保存一条记录。(请求类似于:xxx.com/writelocation.php?lat=33.76&lon=45.0 &alt=12000) 我试图通过使用 asynctask 来解决这个问题,但它没有用。连接速度慢,数据量大。连接完成需要一秒钟多的时间,每秒钟都有一条新记录出现。我正在寻找一种方法,每分钟左右一次发送多个值。到目前为止,除了使用直接访问远程数据库之外,我找不到其他解决方案。 但是我的主机不提供对我的 mysql 数据库的远程访问。

我需要一个聪明而廉价的解决方案来解决我的问题 :) 你有什么建议?是否仅使用远程数据库(通过数据库托管)解决方案?

提前致谢。

【问题讨论】:

您发出的请求是一个 http GET 请求。 POST 可以向您的服务器发送更多数据(限制取决于服务器配置)。但是在 android 中创建 POST 与 GET 不同。你可以试试看androidsnippets.com/… 为什么不尝试在第一分钟将数据存储在 array() 中?您将有时间在第二分钟内异步发送它们并继续存储您的新数据。 我已经解决了这个问题:我在 JSONObjects(lat, lon etc..) 中收集信息,然后在 JSONArray 中创建一个包含 60 秒信息的数组,在 php 上使用 HttpClient 发送 JSONArray一边,我用code$json = $_REQUEST['myjson']; 得到 jsonarray然后用code$locationInfo = json_decode($json); 解码然后遍历这些值并将它们写入mysql。完成 3G+ 连接大约需要 3 秒。一旦我弄清楚如何使用 IntelliJ IDEA 配置 github,我会将代码上传到 github。非常感谢。 【参考方案1】:

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]=longitude&loc1[lat]=latitude&loc2[lon]=longitude&loc2[lat]=latitude

所以你得到:

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" )

另外,请确保您的数据是正确的escaped。这可能因您使用的数据库 API 而异。

【讨论】:

【参考方案2】:

Json 编码速度非常快,带宽消耗非常小。我建议你使用 json 发送这些数据,然后在服务器端解析 json 并将数据插入数据库中。

要了解更多关于android中的json,请参阅http://www.vogella.com/articles/AndroidJSON/article.html

你怎么看?

【讨论】:

是的,这就是解决方案。非常感谢。我试图在对我的问题的评论中解释该方法。【参考方案3】:

使用 INSERT DELAYED 代替 INSERT。对于这种情况,MySQL 也不是一个真正可扩展的解决方案,也许最好使用 MongoSQL 来处理这么多的请求。您还可以将服务器上的请求保存为文本文件,并每隔几秒或几分钟批量运行查询

【讨论】:

您不认为 PHP 会话会是比文件 I/O 更好的解决方案吗? 对于您对 INSERT DELAYED 的建议,我已将您的评论加倍,因为我从未听说过它,而且在正确的情况下似乎很难使用它。很好的建议。 INSERT DELAYED 非常棒:D 特别是当您在数据库中存储一些日志并且您不太关心日志的确切顺序时。 MySQL 处理得很好【参考方案4】:

试图每秒发送每个新位置是一个基本的设计缺陷,我建议避免这种策略,因为您无法保证移动设备的网络可用性和延迟。

这样做的方法是在本地缓冲数据,然后将其分块提交给服务器。例如,收集十分钟的数据并一次性发送。请记住,除了您已经发现的网络延迟限制之外,建立然后断开连接还会产生网络开销和电池寿命影响。因此,出于多种原因,最好在本地缓冲数据并在合理的时间间隔后发送缓冲区。

每次将数据发送到服务器时,请在 POST 请求中执行此操作。这种请求应该用于提交任何显着大小的数据,这也意味着如果您以后需要,可以使用 TLS 对数据进行加密。

【讨论】:

+1 用于发起请求开销、本地缓冲区、POST 请求和未来的 TLS 验证。这里有很好的建议,我希望 OP 在开发他的应用程序时考虑到这些。 非常感谢您的警告。我在一分钟的数组中缓冲信息。因此,我一直在寻找一种同时发送多行数据的方法。如果我还没有找到实现这一点的方法,我正在考虑通过直接连接将它们一个一个发送到远程数据库。希望我在这个伟大的社区的帮助下设法解决了这个问题。

以上是关于如何一次将多个值发送到 Web 服务器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何一次将多行保存到多个数据库表

使用php一次将多个项目提交到贝宝购物车

如何使用 JQuery 一次将多个图像添加到 DOM?

使用 Summernote File 一次将多个文件上传到服务器

如何一次将一个项目添加(推送)到一个数组(循环遍历数组)

如何一次将多个关系保存到 CoreData?