天天看点

Ajax长连接和SignalR(刷新客户端数据)的区别 ajax实现长连接

ajax实现长连接

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>      
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">      
<html>      
<head>      
<meta http-equiv="pragma" content="no-cache">      
<meta http-equiv="cache-control" content="no-cache">      
<meta http-equiv="expires" content="0">      
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />      
<%@ include file="/tags/jquery-lib.jsp"%>      
<script type="text/javascript">      
$(function () {      
(function longPolling() {      
$.ajax({      
url: "${pageContext.request.contextPath}/communication/user/ajax.mvc",      
data: {"timed": new Date().getTime()},      
dataType: "text",      
timeout: 5000,      
error: function (XMLHttpRequest, textStatus, errorThrown) {      
$("#state").append("[state: " + textStatus + ", error: " + errorThrown + " ]<br/>");      
if (textStatus == "timeout") { // 请求超时      
longPolling(); // 递归调用      
// 其他错误,如网络错误等      
} else {       
longPolling();      
}      
},      
success: function (data, textStatus) {      
$("#state").append("[state: " + textStatus + ", data: { " + data + "} ]<br/>");      
if (textStatus == "success") { // 请求成功      
longPolling();      
}      
}      
});      
})();      
});      
</script>      
</head>      
<body>

上面这段代码就是采用Ajax的方式完成长连接,主要优点就是和服务器始终保持一个连接。如果当前连接请求成功后,将更新数据并且继续创建一个新的连接和服务器保持联系。如果连接超时或发生异常,这个时候程序也会创建一个新连接继续请求。这样就大大节省了服务器和网络资源,提高了程序的性能,从而也保证了程序的顺序。

      

SignalR 消息推送

关于如何使用SignalR服务推送数据到客户端在上一篇文章中已经写了详细的案例,不了解的可以先去了解SignalR的实现方式。

关于两者的区别(个人见解,不正确的地方请指出):

Ajax长连接:

Ajax长连接是客户端不停的向服务器发送请求以获取最新的数据信息。这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已。

主要优点就是和服务器始终保持一个连接。如果当前连接请求成功后,将更新数据并继续创建一个新的连接和服务器保持联系。如果连接超时或发生异常,这个时候程序也会创建一个新的连接继续请求,这样就大大节省了网络和服务器资源,提高了程序的性能,从而也保证了程序的顺序。

SignalR:

不需要客户端发出请求,服务器只要发现有了新的数据,立即调用客户端获取数据的方法,从而实现把新的数据推送到客户端展示出来。博主百度百科了一下更专业的说法其实是:

当所连接的客户端变得可用时,服务器代码可以立即向其推送内容,而不是让服务器等待客户端请求新的数据。

关注90後梦想大师,梦想从未止步.

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>      
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">      
<html>      
<head>      
<meta http-equiv="pragma" content="no-cache">      
<meta http-equiv="cache-control" content="no-cache">      
<meta http-equiv="expires" content="0">      
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />      
<%@ include file="/tags/jquery-lib.jsp"%>      
<script type="text/javascript">      
$(function () {      
(function longPolling() {      
$.ajax({      
url: "${pageContext.request.contextPath}/communication/user/ajax.mvc",      
data: {"timed": new Date().getTime()},      
dataType: "text",      
timeout: 5000,      
error: function (XMLHttpRequest, textStatus, errorThrown) {      
$("#state").append("[state: " + textStatus + ", error: " + errorThrown + " ]<br/>");      
if (textStatus == "timeout") { // 请求超时      
longPolling(); // 递归调用      
// 其他错误,如网络错误等      
} else {       
longPolling();      
}      
},      
success: function (data, textStatus) {      
$("#state").append("[state: " + textStatus + ", data: { " + data + "} ]<br/>");      
if (textStatus == "success") { // 请求成功      
longPolling();      
}      
}      
});      
})();      
});      
</script>      
</head>      
<body>

上面这段代码就是采用Ajax的方式完成长连接,主要优点就是和服务器始终保持一个连接。如果当前连接请求成功后,将更新数据并且继续创建一个新的连接和服务器保持联系。如果连接超时或发生异常,这个时候程序也会创建一个新连接继续请求。这样就大大节省了服务器和网络资源,提高了程序的性能,从而也保证了程序的顺序。

      

继续阅读