http通信是单向通信,也就是说如果没有客户端请求,服务器是不能向客户端发送信息的。
为了实现服务器的推送等功能,引入了长轮询和websocket.
什么是长轮询?
利用ajax,对服务器端进行请求。服务器hold住这个请求,把它长期保存在一个线程安全的集合里。这样服务器就可以在需要时在拿出请求,进行回应。
这里注意的是js端,用了
function connect(){
$.ajax({
url:"longpolling?method=onOpen",
cache:false,
dataType:"text",
success:function(data){
connect();
alert(data);
}
});
}
这里写成了无线循环,但是在长连接中,由于后台并不是在接收到请求后就立刻发送回应,因此这个链接会被服务器端一直持有。直到回应到达以后,success:function() 才会被执行。之所以在之后立刻重新执行的原因是,需要一个新的长连接再次发回给服务器,让服务器端继续保持直到下一次response的到来。
websocket的全双工通信。它是又H5提供,多个浏览器支持。
它使用ws或者是wss协议,直接保持一个长连接。
它允许和js建立一个远程的链接。
并且为链接两端提供了函数调用
send()向远程端发信息,close()关闭该链接。
监听函数:onopen() 网络建立时触发
onerror() 网络错误时触发
onclose() 关闭时触发
onmessage() 接受消息时触发
注意的是,类通过@ServerEndpoint()把自己作为一个服务器端点,所以你的线程安全集合里放的是这个端点类。
这个链接
当然也有很多开源框架帮助推送
https://www.cnblogs.com/best/p/5695570.html
网友评论