不等待响应的HTTP请求

4
是否可以在不等待响应的情况下发送HTTP请求?
我正在开发一个物联网项目,需要记录来自传感器的数据。在每个设置中,有许多传感器和一个中央协调器(大多数情况下将使用树莓派实现),它从传感器收集数据并通过互联网将数据发送到服务器。
这种记录每秒钟发生一次。因此,数据发送应该快速进行,以便队列不会变得太大。如果请求不等待响应(例如UDP),则会更快。
偶尔丢失几个数据包是可以接受的。
请告诉我最好的实现方式。最好用Java实现。
服务器端使用PHP实现。
提前致谢!
编辑: 传感器是无线的,但它们使用的技术在向协调器发送数据时具有非常少(或没有)延迟。该协调器必须通过互联网发送数据。但是,假设互联网连接不好。因为这将在印度偏远地区实施。

是的,但这可能会成为我的问题。因为有很多传感器,每秒钟发送数据。队列会逐渐增加,变得非常大,不是吗? - Sid Prasad
一些更多的细节是相关的...你的硬件是有线还是无线的(主要是由于延迟/丢失)?你的服务器是本地的还是基于Web的?你的项目是本地的,还是使用了库?此外,你能否批量处理内容并一次发送多个(解决XY问题)? - Bonatti
试一下,这真的是个问题吗?使用http协议,你基本上必须等待回复,因为通常你想要确保它是200 OK,而在服务器没有处理完你的请求之前,你无法得到这个回复。你的服务器应该异步处理请求,这样它就可以立即回复200了。 - zapl
@Chill,是的,我并不在意服务器响应。我只想记录数据。所有对数据的处理都会定期和分开进行。 - Sid Prasad
@Bonatti,所有的传感器都是无线的,但它们使用的技术在发送到协调器时几乎没有延迟(或没有延迟)。但是,请假设互联网连接非常差。因为这将在印度偏远地区实施。 - Sid Prasad
显示剩余6条评论
2个回答

2
你需要寻找像OkHttp这样的异步HTTP库。它允许指定回调以异步方式执行(由第二个线程执行)。因此,你的主线程可以继续执行。

是的,但这对我可能会成为一个问题。因为有很多传感器,每个传感器每秒钟发送数据。队列会积累并变得非常大,不是吗? - Sid Prasad
这可能发生,但是如果您有实时要求,Java不是适合您的语言,TCP或HTTP也不是互联网上次秒交易的正确协议。 - Robert
不,第一线程可以循环遍历您的日志请求,并快速发送所有请求。每个请求都将设置一个回调函数,在服务器响应时激活该函数,而在您的情况下,这个函数似乎是一个空方法。如果由于回调条目增加导致服务器变慢,则可能会使用一些内存,但这只是很小的问题。 - Nerdfest
@Robert,你会推荐哪种语言和协议呢? - Sid Prasad

2
你可以将GET请求的TCP超时设置为不到一秒,并在一个线程中保持重新触发访问。使用更多的线程用于更多的设备。
例如:
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("GET");
con.setConnectTimeout(1000); //set timeout to 1 second
if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
   ...
}

如果访问时间少于1秒,则暂停线程剩余的1秒。如果将结果添加到线程安全队列中,则可以在另一个线程上使用这些结果。请务必处理异常。
无法使用UDP与HTTP,HTTP仅支持TCP。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接