我对ColdFusion(使用ColdFusion10)相对陌生,我有一个关于创建实时更新表的问题。
目前,我有一个C#应用程序,我每2秒将股价写入csv(文本)文件,并希望在网页上的表格中反映这些变化。我知道我可以每2秒刷新一次整个表,但这会向服务器产生很多请求,我想知道是否有更好的方法?使用ColdFusion 10的新html5 Web套接字功能可以轻松实现这一点吗?
如有任何关于采取何种方式或如何实现这一目标的建议/指导,我们将不胜感激!
谢谢,阿兰·詹姆斯。
我认为你可以重写你的问题,在第一个小时内至少得到5个答案。
现在来回答,如果我很清楚你在问什么。
IMHO的websocket还没有出现,如果你的网站面向广大用户,并且你不能100%确定它们是否配有最新的Chrome或FF,那就忘了吧。
您可以使用一些javascript websocket库,它可以优雅地回退到flash或AJAX HTTP轮询,比如http://socket.io/或者像pusher.com这样的云服务。但这会让你的生活变得复杂,因为如果你实现了轮询和websocket,你在后端的工作会增加2-3倍。
关于请求量,如果你想在屏幕上显示实时数据,你必须有服务器来支持它
如果您请求一次并刷新所有表的数据,则可以进行优化,因此不是每个单元格。您可以一次获得所有新数据,并更新那些使用jquery更改的单元格。因此,不再提取所有数据,或者整个表HTML,只提取最少量的数据。
AJAX轮询肯定有助于处理请求量,但打开请求的时间是另一个可能的问题。你可以用BlazeDS做民意调查,它甚至在ColdFusion 9中。
一些页面可以查看:
http://www.bennadel.com/blog/2351-ColdFusion-10-Using-WebSockets-To-Push-A-Message-To-A-Target-User.htm
http://www.bennadel.com/blog/1956-Very-Simple-Pusher-And-ColdFusion-Powered-Chat.htm
http://nil.checksite.co.uk/index.cfm/2010/1/28/CF-BlazeDS-AJAX-LongPolling-Part1
如果不从页面向服务器发出某种请求,就没有办法每2秒获得实时更新,否则它怎么知道是否有任何变化?
就我个人而言,我会写一个CFC方法来读取您的文本文件,看看它是否发生了更改,然后每隔几秒钟使用jQuery轮询一次该方法,以返回它是否发生更改,并传回任何更新的内容。
在不了解文本文件等详细信息的情况下,很难写出准确的内容。从根本上讲,您的CFC方法必须存储(可能在SESSION var中)文本文件数据的副本,这样它就可以将其与最新读入的数据进行比较,并判断是否有任何变化。如果它已经改变了,那么发送一个结构和更新,或者返回一个响应说它没有改变。
你的CFC代码看起来像这样:
<cffunction name="check_update" access="remote" output="false">
<cfset response = structNew()>
<cffile action="read"
file="pathtoyourtextfile.txt"
variable="file_content"
>
<cfif file_content NEQ SESSION.file_content>
<cfset response.updated = true>
<cfset SESSION.file_content = file_content>
<cfset response.content = structNew()>
<!--- code here to populate 'content' variable with updated info --->
<cfelse>
<cfset response.updated = false>
</cfif>
<cfreturn response>
</cffunction>
然后,用于轮询该数据的jQuery代码将如下所示:
var update_interval;
var update_pause = 3000;
function check_update() {
var request = {
returnformat : 'json',
queryformat : 'column',
method: 'check_update'
}
$.getJSON("path/to/your/service.cfc", request, function(data) {
if(data.UPDATED == true) {
/* code here to iterate through data.CONTENT */
/* and render out your updated info to your table */
}
});
}
$(document).ready(function () {
update_interval = setInterval(check_update(), update_pause);
});
因此,一旦DOM准备好,我们就创建一个间隔,在本例中,该间隔每3秒(3000ms)触发一次,并调用check_update()函数。该函数调用您的CFC,并检查响应。如果响应UPDATED值为true,那么它将运行任何代码来呈现更新。
这是实现所需内容的最简单方法,无论浏览器如何,都应该有效。根据我的经验,轮询这样的CFC的开销确实非常小,而且你传输的数据量也很小,所以处理起来应该没有问题。
我认为没有任何其他方法可以更轻量级/更容易组合。长轮询或SSE(具有不可靠的浏览器支持)的好处可以忽略不计,不值得编程开销。
谢谢,Henry