在JAVA中长时间轮询Jquery?

这是我的Java Chat application的问题。

当我的应用程序启动时,我将在我的外部Jquery中调用pingAction()

Jquery pingAction将是,

 function pingAction(){ $.ajax( { type: "post", url: "PingAction", async: false, data : "userId="+encodeURIComponent(userId)+"&secureKey="+encodeURIComponent(secureKey)+"&sid="+Math.random() , cache:false, complete: pingAction, timeout: 5000 , contentType: "application/x-www-form-urlencoded; charset=utf-8", scriptCharset: "utf-8" , dataType: "html", error: function (xhr, ajaxOptions, thrownError) { alert("xhr.status : "+xhr.status); if(xhr.status == 12029 || xhr.status == 0){ //alert("XMLHttp status : "+xhr.status); $("#serverMsg").css("backgroundColor" , "yellow"); $("#serverMsg").text("Your Network connection is failed !"); $("#serverMsg").show(); } //setTimeout('pingAction()', 5000); xhr.abort(); }, success: function( responseData , status){ if($("#serverMsg").text() == "" || $("#serverMsg").text() == "Your Network connection is failed !"){ disableServerMessage(); } if(responseData != "null" && responseData.length != 0 && responseData != null){ var stringToArray = new Array; stringToArray = responseData.split(""); var len = stringToArray.length; for(var i=0;i<len-1;i++){ getText(stringToArray[i]); } } //setTimeout('pingAction()', 5000); } } ); } 

我的PingAction Servlet将是,

 public class PingAction extends HttpServlet { private static final long serialVersionUID = 1L; private String secureKey; private String userId; private int fromPosition ; private FlexChatProtocol protocol = null; private Ping ping = null; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("UTF-8"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("UTF-8"); secureKey = request.getParameter("secureKey"); userId = request.getParameter("userId"); CustomerInfo customer = ApplicationInfo.customerDetails.get(userId); if(customer != null){ fromPosition = customer.getFromPosition(); } if(ApplicationInfo.flexProtocol != null ){ protocol = ApplicationInfo.flexProtocol; ping = new Ping(); ping.sendPing(secureKey, userId, fromPosition+1, protocol, serverMessage); if(customer != null){ message = customer.getFullMessage(); } out.println(message); } } } 

在使用Long Poling之前,我将使用setTimeInterval()刷新连接并获取服务器消息,每隔5 seconds pingAction() in javaScript调用pingAction() in javaScript

现在我需要在聊天应用程序中使用LONG POLLING concept 。所以我修改了我的Jquery pinAction() ,你在上面看到了什么。

如何使用JQUERY实现LONG POLLING

希望我们的堆栈成员能帮助我!

 private ChatContext context = ChatContext.getInstance(); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); Long lastmessage = // just put this somewhere List messages = context.getMessagesIHaventGotYet(lastmessage); // blocking call Object formatedMessages = formatmessages(messages); out.write(formatedMessages); } 

context.getMessagesIHaventGotYet(); 应该是一个阻塞操作,所以它一直等待,直到新的消息到达,然后它开始行动。 或类似的规定。

基本上长轮询意味着服务器“挂起”直到从某处检索到所需的信息,然后将其写入其输出缓冲区并关闭连接,客户端再次实例化连接ASAP以启动另一个长轮询。