这是我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("<//br//>");
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
之前,我会使用pingAction() in javaScript
为每个5 seconds
调用setTimeInterval()
来刷新连接并获取服务器消息。
现在我需要在聊天应用程序中使用LONG POLLING concept
。所以我修改了我在上面看到的Jquery pinAction()
。
如何使用LONG POLLING
来实现JQUERY
?
希望我们的堆叠成员会帮助我!
答案 0 :(得分:1)
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<String> messages = context.getMessagesIHaventGotYet(lastmessage); // blocking call
Object formatedMessages = formatmessages(messages);
out.write(formatedMessages);
}
context.getMessagesIHaventGotYet();应该是一个阻塞操作,所以它一直等待,直到新的消息到达,然后它开始行动。 或类似的东西。
基本上长轮询意味着服务器“挂起”直到从某处检索到所需的信息,然后将其写入其输出缓冲区并关闭连接,客户端再次实例化连接ASAP以启动另一个长轮询。 / p>