一、长轮询
1、什么是长轮询?
长轮询是指在客户端向服务器发送请求后,服务器并不立即返回结果,而是将请求挂起,等待服务器端数据更新后才立即返回结果给客户端,并随即再次发起一个请求。这种方式可以有效地解决短轮询中的频繁请求问题。
2、长轮询的优点
①长轮询相较于短轮询,可以大幅减少请求次数,节约带宽资源。
②长轮询可以保持连接,实时接收服务器更新的数据。这种方式非常适合于在线聊天、即时通讯等需要及时更新的应用场景。
③长轮询的数据传输方式相较于WebSocket的全双工传输方式更加简单,更容易实现。
3、长轮询的缺点
①长轮询的实现会稍微复杂些,因为需要判断是否有新数据产生,不然会一直等待下去。
②由于必须等待,所以对请求结束时间没有限制,可能导致客户端长时间无响应。
长轮询的实现代码示例:
// 客户端代码 function longPolling() { $.ajax({ url: '/check_new_data', type: 'get', dataType: 'json', timeout: 30000, success: function (data) { // 处理返回的数据 longPolling(); }, error: function (xhr, errorType, error) { if (xhr.status == 404) { longPolling(); } else if (errorType == "timeout") { longPolling(); } else { longPolling(); } } }); } longPolling(); // 服务端代码 function check_new_data(request, response) { while (true) { // 判断是否有新数据产生 if (has_new_data()) { response.write(JSON.stringify(new_data)); break; } } }
二、短轮询
1、什么是短轮询?
短轮询是指客户端通过不断向服务器发送请求询问,服务器即时返回最新数据。这种方式容易产生频繁请求的问题。
2、短轮询的优点
①短轮询相较于长轮询,实现更简单。
②短轮询可以有效地更新数据,适用于用户无特殊需求,数据更新并不是那么频繁的场景。
3、短轮询的缺点
①由于发送请求的频率过高,导致带宽资源被极度浪费。
②由于返回数据的过程需要大量的时间和网络等待,会导致服务器压力增大,甚至可能导致服务器拒绝服务。
短轮询的实现代码示例:
// 客户端代码 function shortPolling() { $.ajax({ url: '/get_new_data', type: 'get', dataType: 'json', success: function (data) { // 处理返回的数据 shortPolling(); } }); } shortPolling(); // 服务端代码 function get_new_data(request, response) { // 从数据库中获取最新数据 response.write(JSON.stringify(new_data)); }
三、长轮询与短轮询的比较
1、频率问题
长轮询的频率比短轮询低,因此可以避免频繁请求的问题。这样可以节省网络资源,提高服务器资源的利用率。相反,短轮询会频繁的发送请求来获取数据,造成大量的网络资源的浪费,而且服务器也不得不频繁的响应请求。
2、实时性问题
长轮询数据获取速度相对较快,能够实时返回数据,通过判断客户端与服务器之间的连接状态,再将数据推送到客户端。但短轮询是每隔一段时间请求一次数据,数据属于实时获取不到,取决于客户端和服务器之间的网络环境及数据更新速度。
3、复杂性问题
长轮询的实现相对于短轮询来说会多出一些代码,但功能上的扩展性比较强,比如可以实现等待任务队列,定时作业,事件驱动程序,更加适合实现实时通讯。短轮询的实现比较简单,因此比较适合那些小型应用,如个人网站的回帖评论等。
长轮询与短轮询的比较代码示例:
// 长轮询 function long_polling() { $.ajax({ url: "/check_new_data", type: 'get', dataType: 'json', timeout: 30000, success: function (data) { // 处理返回数据 long_polling(); }, error: function (xhr, errorType, error) { if (xhr.status == 404) { // 重新发送请求 long_polling(); } else if (errorType == "timeout") { // 重新发送请求 long_polling(); } else { // 其他错误,重新发送请求 long_polling(); } } }); } // 短轮询 function short_polling() { $.ajax({ url: "/get_new_data", type: 'get', dataType: 'json', success: function (data) { // 处理返回数据 short_polling(); } }); }
四、长轮询与短轮询的应用场景
1、长轮询应用场景
长连接和长轮询比较适合于需要实时数据的应用场景,如在线对话,即时通讯,视频直播、在线游戏等。
2、短轮询应用场景
短链接和短轮询适用于一些静态数据或者内容不需要实时更新的场景,如新闻、博客评论、紧急通知等。
长轮询与短轮询的应用场景代码示例:
// 长轮询 function chat_long_polling() { $.ajax({ url: "/check_new_message", type: 'get', dataType: 'json', timeout: 30000, success: function (data) { // 处理返回数据 chat_long_polling(); }, error: function (xhr, errorType, error) { if (xhr.status == 404) { // 重新发送请求 chat_long_polling(); } else if (errorType == "timeout") { // 重新发送请求 chat_long_polling(); } else { // 其他错误,重新发送请求 chat_long_polling(); } } }); } // 短轮询 function blog_short_polling() { $.ajax({ url: "/get_new_comment", type: 'get', dataType: 'json', success: function (data) { // 处理返回数据 blog_short_polling(); } }); }
五、总结
总的来说,长轮询和短轮询各有优劣。长轮询适用于对实时性要求较高的应用场景,可以有效减少请求次数,节省带宽资源,并且相较于WebSocket实现更为简单。短轮询适用于数据不需要实时更新的场景,实现简单,但会导致大量网络带宽的浪费。因此,在选择长轮询或短轮询的方案时,需要根据具体应用场景来选择合适的方案,以达到最佳的用户体验和网络性能。