拉勾上和微博这个技术是怎么实现的?


图片描述

在我没有任何刷新的情况这个消息框是自动弹出的,像微薄的私信也是?这个不会是用AJAX一直请求的吧?好奇是怎么实现的,等大神回答

Redis php

radio 10 years, 4 months ago

前端JS可以在捕捉到特定事件后向服务器发送请求,比如当窗口获取焦点时(window.onfocus),查询一次用户消息:


 window.onblur  = function(){document.title = '失去焦点';};
window.onfocus = function(){document.title = '获得焦点';};

如果只是普通的消息推送(不追求很高的实时性),可以考虑隔10分钟用AJAX轮询一次.

kenciwu answered 10 years, 4 months ago

楼上的别带坏小朋友了,轮询和websocket太耗服务器了,还是学sf用setinterval请求服务器吧

teetii answered 10 years, 4 months ago

  1. Websocket
  2. Ajax轮询
  3. 长连接(Comet)
wealth answered 10 years, 4 months ago

我刚才看了一下segmentfault上消息通知的实现。他是有两种方式同时实现的:
1.给标签页绑定一个当前页面是否可见事件,当用户把页面切到segmentfault.com域名下的页面时,触发页面可见事件,发送请求。


 javascript


 document.addEventListener(visibilityChange, function() {
    if(document[state]=="hidden"){
        // 标签页不可见
    }else{
        // 标签页可见
        // 向服务器请求用户的消息
    }
}, false);

2.打开控制台的network,可以发现,segmentfault应该也是在使用setInterval()在向服务器发送请求,时间间隔差不多是35秒左右。或者使用其他的轮询技术向服务器发送请求

Juuyonn answered 10 years, 4 months ago

大家想多了,就是轮询!

册册cee answered 10 years, 4 months ago

segmentfault社区也是轮询,你把开发者工具打开,看network那一项,等一会就会看到请求的。

o準駙馬o answered 10 years, 4 months ago

会不会用的是html5的SEE呢

FCSMio answered 10 years, 4 months ago

应该都是消息推送,搜索关键字:cometd

vvvlmks answered 10 years, 4 months ago

可以通过websocket实现,之前测试过flask-websocket,可以用户登录时服务器建立一个room,然后用户加入这个room,当服务端收到相关消息时就判断针对该用户的room是否存在,存在则给这个room发消息。当用户关闭页面时,这个连接会断开,则删除对应room。

bbzhu answered 10 years, 4 months ago

直接使用ajax就可以了, 比如,使用jQuery, 后台有个url直接轮询即可

ye11ow answered 10 years, 4 months ago

可以实现的方法太多了,比如websocket,或者ajax轮询等等

红白塞钱箱 answered 10 years, 4 months ago

Your Answer