這篇文章寫的很好Web 通訊 之 長串連、長輪詢(long polling),受益匪淺。 1.什麼是長輪詢,長串連
用通俗易懂的話來說,就是用戶端不停的向伺服器發送請求以擷取最新的資料資訊。這裡的“不停”其實是有停止的,只是我們人眼無法分辨是否停止,它只是一種快速的停下然後又立即開始串連而已。
2.我的應用程式情境
想做一個二維碼簽到系統.
主要要求:
- 在瀏覽器上發布簽到
- 一個二維碼只能用一次
- 當瀏覽器上顯示的二維碼被使用過後,自動重新整理成新的二維碼 3.具體代碼 頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title></title></head><script type="text/javascript"> function myajax() { var myhttp; myhttp=new XMLHttpRequest(); myhttp.open("GET", "qrajax", true); myhttp.send(); myhttp.onreadystatechange=function() { if (myhttp.readyState==4 && myhttp.status==200) { var msg=myhttp.responseText; document.getElementById("asd").innerHTML=msg; if(msg!="failed"){ document.getElementById("QRcode").src= "qrcoder?flag="+Math.random()+"&teacherID="+document.getElementById("tecID").value; } } } } //長輪詢,10秒發送一次ajax請求 window.setInterval(myajax,10000);</script><body><textarea id="asd"></textarea><img src="qr" id="qrajax"/><input type="text" id="tecID"/><button type="button" onclick="myajax()">Change Content</button></body></html>
伺服器端
package com.servlet;import com.service.QRService;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import java.io.IOException;import java.io.PrintWriter;public class QRAjax extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session=request.getSession(); QRService service=new QRService(); PrintWriter out = response.getWriter(); //計時 int time=0; if(session!=null){ //長輪詢 while(true) { time++; //判斷二維碼是否被使用過 if (service.isReflash()) { out.print("no "+session.getAttribute("recordCount")+" "); break; }else{ //保持10秒 if(time>=10){ out.print("failed"); break; }else { try { //保持住,1秒迴圈一次 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } out.close(); }}