1:原理: Http连接是无状态的,请求过去就返回,所以;要实现http的长连接,实现服务器的想客户端推送,需要阻塞请求,等到数据更新然后处理返回给客户端,此时客户端自动请求服务端: js代码简单的为:
function sendMsg() { var jid = $("#jid").val(); var tojid = $("#list").val(); var content = $("#msg").val(); $.post("chat", { jid : jid, tojid : tojid, content : content }, function(result) { }); } $(document).ready(function() { /** * 聊天窗口 */ $.post("show", { eventName : 'msg' }, function(result) { $("#his").append(result).append("<br/>"); showMsg(); }); /** * 用户列表 */ $.post("userlist",{eventName : 'userlist'}, function(result){ var userlist = $("#userlist"); userlist.append(result).append("<br/>"); }); }); function showMsg() { $.post("show", { eventName : 'msg' }, function(result) { $("#his").append(result); showMsg(); }); }
我们以聊天程序为列:
初始化的时候 客户端发一次show请求到servlet,服务器阻塞wait改请求,然后等到客户端发送消息;在那个servlet中释放notifyall改阻塞,继续下执行处理-----。