我可以找到很多关于长轮询如何工作的信息(例如,这个和这个),但没有简单的例子说明如何在代码中实现这一点。
我能找到的只有cometd,它依赖DojoJS框架和一个相当复杂的服务器系统。。
基本上,我将如何使用Apache来服务请求,以及我将如何编写一个简单的脚本(例如,用PHP)来“长轮询”服务器以获取新消息?
该示例不一定是可扩展的、安全的或完整的,它只需要工作即可!
我可以找到很多关于长轮询如何工作的信息(例如,这个和这个),但没有简单的例子说明如何在代码中实现这一点。
我能找到的只有cometd,它依赖DojoJS框架和一个相当复杂的服务器系统。。
基本上,我将如何使用Apache来服务请求,以及我将如何编写一个简单的脚本(例如,用PHP)来“长轮询”服务器以获取新消息?
该示例不一定是可扩展的、安全的或完整的,它只需要工作即可!
当前回答
我认为客户端看起来像一个普通的异步AJAX请求,但您希望它需要“很长时间”才能返回。
然后服务器看起来像这样。
while (!hasNewData())
usleep(50);
outputNewData();
因此,AJAX请求将发送到服务器,可能包括上次更新的时间戳,以便hasNewData()知道您已经获得了哪些数据。然后,服务器在循环中休眠,直到新数据可用。一直以来,您的AJAX请求仍然连接,只是挂在那里等待数据。最后,当新数据可用时,服务器将其提供给AJAX请求并关闭连接。
其他回答
我用这个来掌握Comet,我还使用Java Glassfish服务器设置了Comet,并通过订阅cometdaily.com找到了许多其他示例
我有一个非常简单的聊天示例作为晃动的一部分。
编辑:(因为每个人都在这里粘贴代码)
这是使用长轮询和晃动的完整的基于JSON的多用户聊天。这是一个如何进行调用的演示,因此请忽略XSS问题。任何人都不应该在不首先清理它的情况下部署它。
请注意,客户端始终与服务器保持连接,一旦有人发送消息,每个人都应该立即大致看到。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- Copyright (c) 2008 Dustin Sallings <dustin+html@spy.net> -->
<html lang="en">
<head>
<title>slosh chat</title>
<script type="text/javascript"
src="http://code.jquery.com/jquery-latest.js"></script>
<link title="Default" rel="stylesheet" media="screen" href="style.css" />
</head>
<body>
<h1>Welcome to Slosh Chat</h1>
<div id="messages">
<div>
<span class="from">First!:</span>
<span class="msg">Welcome to chat. Please don't hurt each other.</span>
</div>
</div>
<form method="post" action="#">
<div>Nick: <input id='from' type="text" name="from"/></div>
<div>Message:</div>
<div><textarea id='msg' name="msg"></textarea></div>
<div><input type="submit" value="Say it" id="submit"/></div>
</form>
<script type="text/javascript">
function gotData(json, st) {
var msgs=$('#messages');
$.each(json.res, function(idx, p) {
var from = p.from[0]
var msg = p.msg[0]
msgs.append("<div><span class='from'>" + from + ":</span>" +
" <span class='msg'>" + msg + "</span></div>");
});
// The jQuery wrapped msgs above does not work here.
var msgs=document.getElementById("messages");
msgs.scrollTop = msgs.scrollHeight;
}
function getNewComments() {
$.getJSON('/topics/chat.json', gotData);
}
$(document).ready(function() {
$(document).ajaxStop(getNewComments);
$("form").submit(function() {
$.post('/topics/chat', $('form').serialize());
return false;
});
getNewComments();
});
</script>
</body>
</html>
下面是我在C#中用于长轮询的一些类。基本上有6个类(见下文)。
控制器:处理创建有效响应所需的操作(数据库操作等)处理器:管理与网页(自身)的异步通信IAsynchProcessor:实现此接口的服务进程实例服务:处理实现IAsynchProcessor的请求对象请求:包含响应(对象)的IAsynchProcessor包装响应:包含自定义对象或字段
看看这篇博文,里面有Python/Django/gevent中一个简单聊天应用程序的代码。
对于ASP.NET MVC实现,请查看NuGet上提供的SignalR。。请注意,NuGet与Git源代码相比常常是过时的,因为Git源经常提交。
在Scott Hanselman的博客上阅读有关SignalR的更多信息