https://www.cnblogs.com/voxov/p/14542590.html
https://zhuanlan.zhihu.com/p/634348802
https://www.bilibili.com/video/BV1p2421c7T1/
今天,我想向大家介绍一个简单的HTTP长轮询示例,其源码已经上传到GitHub,链接将在视频简介中提供。这个示例利用了HTTP的Keep-Alive机制,并通过不断向客户端发送数据的方式来实现长轮询。
首先,这个示例基于一个简单的Spring Boot应用构建。我开启了@ServletComponentScan注解,以便扫描和注册自定义的Servlet。其中包含一个简单的测试控制器,它返回一个名为test的页面。
页面使用了较为传统的JavaScript代码。页面内定义了一个表单form1,但没有指定提交的URL,target属性设置为一个不可见的iframe,这样返回的数据就会被放入这个iframe中。同时,页面包括一个div容器,用于显示返回的数据。
页面初始化后,会立即执行init方法,该方法设置了表单的action属性为服务器端的URL,并提交表单。还有一个JavaScript函数负责接收数据,将其添加到div容器中。
在后端,当表单提交后,对应的Servlet会被触发。Servlet中,我定义了一个当前时间的变量,并初始化了一个日期格式化对象。这里没有考虑线程安全问题,仅作为演示。Servlet的doPost方法包含了循环逻辑,只要连接存在,就不断返回数据。每5秒发送一次数据,并检查发送是否成功,如果发送失败,则关闭连接。
发送数据的sendData方法首先设置内容类型,然后发送一段JavaScript脚本,该脚本调用了父页面中的一个函数,并传递了数据作为参数。因此,页面不断调用这个函数来处理返回的数据。
这个长轮询的过程,通过在页面上不断提交表单,并通过服务器端Servlet不停地返回数据,以实现长时间的连接和数据更新。由于使用了块传输编码,服务器端可以持续发送数据而不必关闭连接,从而实现了HTTP长轮询的效果。
现在,让我们运行这个应用并访问页面。你会看到,页面处于不断加载状态,这正是长轮询的标志。每隔5秒,页面就会更新显示当前时间。
为了深入理解底层数据传输,我们可以通过抓包工具来观察。重启页面并抓包后,我们可以看到详细的请求响应过程,包括三次握手、GET请求获取页面内容,以及表单提交后服务端返回的数据。通过这种方式,页面能够持续接收来自服务器的数据更新,而无需重新加载或断开连接,展示了HTTP长轮询的原理和实现方法。
原文链接: https://dashen.tech/2017/02/21/HTTP协议中的短轮询、长轮询、长连接和短连接/
版权声明: 转载请注明出处.