基于HTTP长轮询实现简单推送
2013-11-14 18:19
274 查看
应用场景:设备为安卓、PC以及服务器,要求PC端能够单向给移动端发送消息指令,安卓端解析消息,进行后续处理动作。其中安卓端为基于Phonegap开发,说白了,就是HTML+JS。
规模:正常应用为200移动端,PC端数量有限,不超过10台,最多移动端为不超过500台。
可以看出这是一个很小规模的应用,也正如此,才可以给我像这样大方的保有HTTP连接不释放的机会。
当前背景:目前关于推送的实现,无非就是谷歌,HTML5的websocket,韩国某牛写的androidpn,以及第三方和伪推送方式。
谷歌的推送在中国大陆据说不稳定,所以被中国人弃之不用,然后就是HTML5的websocket居然在安卓4.0的机器上还不能被很好的支持,这些足以让那位韩国人写的androidpn在国内火了一阵子,不过后来因为国内的第三方推送开始发力,大部分应用开发者只要不是特别需要的话,就不会自己再做推送了。而伪推送方式,无外乎就是HTTP的长连接或者AJAX的长轮询,以及iframe流的方式(或许还有其他方式),这种技术就被称为comet。
基本原理:安卓端页面不间断的发起轮询请求,服务器接收请求后,如果没有消息可以返回,就先不释放连接,即线程等待,等待超时或者中途被唤醒后,返回给页面,释放连接,安卓端的页面再次发起轮询请求。
服务器端接收到PC端指令后,唤醒等待线程,让安卓端的下次轮询可以获取消息。
代码实现:
服务器端启动时,像ServletContext内添加一个map用于存储PC端像安卓端发送的消息。
View Code
然后就是修改Tomcat的最大连接数,以让服务器能够处理这么多的连接而不至于停止响应:
针对我的这个应用,最大600个处理线程足以应付那500台机器了。单纯我的办公电脑就可以支持发起500个HTTP连接,并由本地的Tomcat处理,相信服务器更能够轻松应付。
另外,需要注意的是:据说单机windows下只支持2000左右的HTTP连接,而Linux下约是1000个,所以各位如果使用这种方法的时候,要注意是否会超出这些限制。
为什么要服务器hold住连接一段时间后释放呢?主要是因为长时间的静态连接容易出问题,另外移动端的网络复杂,所以才会有释放的必要。
规模:正常应用为200移动端,PC端数量有限,不超过10台,最多移动端为不超过500台。
可以看出这是一个很小规模的应用,也正如此,才可以给我像这样大方的保有HTTP连接不释放的机会。
当前背景:目前关于推送的实现,无非就是谷歌,HTML5的websocket,韩国某牛写的androidpn,以及第三方和伪推送方式。
谷歌的推送在中国大陆据说不稳定,所以被中国人弃之不用,然后就是HTML5的websocket居然在安卓4.0的机器上还不能被很好的支持,这些足以让那位韩国人写的androidpn在国内火了一阵子,不过后来因为国内的第三方推送开始发力,大部分应用开发者只要不是特别需要的话,就不会自己再做推送了。而伪推送方式,无外乎就是HTTP的长连接或者AJAX的长轮询,以及iframe流的方式(或许还有其他方式),这种技术就被称为comet。
基本原理:安卓端页面不间断的发起轮询请求,服务器接收请求后,如果没有消息可以返回,就先不释放连接,即线程等待,等待超时或者中途被唤醒后,返回给页面,释放连接,安卓端的页面再次发起轮询请求。
服务器端接收到PC端指令后,唤醒等待线程,让安卓端的下次轮询可以获取消息。
代码实现:
服务器端启动时,像ServletContext内添加一个map用于存储PC端像安卓端发送的消息。
function longPolling(){ $.ajax({ //url:ip+'/haveMsg', url:"http://192.168.1.109:8081/mobileinspect/haveMsg", data:{'userID':111}, dataType:'json', timeout:70000, cache:false, type:"post", success:function(data){ if(data.msg){ if(data.msg=="nomsg"){ window.setTimeout(longPolling,1000) }else{ navigator.notification.confirm(data.msg,onConfirm,"新的消息","接受,拒绝"); window.setTimeout(navigator.notification.beep(1),100); window.setTimeout(longPolling,1000) } } }, error:function(xhr,err){//如果出现错误,则在十秒钟之后,再进行长轮询 window.setTimeout(longPolling,10000) } }) }
View Code
然后就是修改Tomcat的最大连接数,以让服务器能够处理这么多的连接而不至于停止响应:
<Connector connectionTimeout="20000" port="8081" protocol="HTTP/1.1" redirectPort="8443" maxThreads="600" acceptCount="100"/>
针对我的这个应用,最大600个处理线程足以应付那500台机器了。单纯我的办公电脑就可以支持发起500个HTTP连接,并由本地的Tomcat处理,相信服务器更能够轻松应付。
另外,需要注意的是:据说单机windows下只支持2000左右的HTTP连接,而Linux下约是1000个,所以各位如果使用这种方法的时候,要注意是否会超出这些限制。
为什么要服务器hold住连接一段时间后释放呢?主要是因为长时间的静态连接容易出问题,另外移动端的网络复杂,所以才会有释放的必要。
相关文章推荐
- 基于HTTP长轮询实现简单推送
- 基于HTTP长轮询实现简单推送
- 基于HTTP长轮询实现简单推送(未完待续)
- 用 ASP.NET MVC 实现基于 XMLHttpRequest long polling(长轮询) 的 Comet
- 使用NGiNX_HTTP_Push_Module实现简单的服务器推送
- 基于Java实现简单Http服务器之一
- 基于TCP和HTTP协议的RPC简单实现
- 使用NGiNX_HTTP_Push_Module实现简单的服务器推送
- 基于Http Basic Authorization实现的9911miniblog推送
- 使用NGiNX_HTTP_Push_Module实现简单的服务器推送
- 基于JDK http包实现的简单代理服务器
- 使用NGiNX_HTTP_Push_Module实现简单的服务器推送
- 基于TCP和HTTP协议的RPC简单实现
- 基于TCP和HTTP协议的RPC简单实现
- iOS开发利用系统推送Notifaction和轮询实现简单聊天系统
- 基于 Java NIO 实现简单的 HTTP 服务器
- 基于HTTP协议之WEB消息实时推送技术原理及实现
- 基于AJAX的长轮询(long-polling)方式实现简单的聊天室程序
- 用 ASP.NET MVC 实现基于 XMLHttpRequest long polling(长轮询) 的 Comet
- RxEasyHttp一款基于RxJava2+Retrofit2实现简单易用的网络请求框架