关于B/S判断浏览器断开的问题讨论


Posted in Javascript onOctober 29, 2008

客户端通过脚本和服务器保持请求,每次请求刷新一个时间,服务器检查这个时间,如果发现时间超过预定,则可以判断该客户端浏览器已关闭。然后对进行相应得操作。如果你想知道是那个客户端浏览器关闭,可以把会话绑定到轮询对象中。长连接不是所有服务器都支持得,这种方式,比你的现实多了。
我的个人看法。
我首先同意这几种做法
,它们也能实现这个需求,他们都通过客户端的轮询,更新服务器的最后访问时间,让服务器检测超时。我来谈谈我对这2种做法的理解

1 服务器端如何进行超时判断,启动一个后台线程进行定时轮询?循环检查每个session是否超过了间隔?
2 如果用线程,那么服务器端判断的间隔或者周期是多少,1秒,10秒,20秒..
3 如果大家都用10秒间隔,客户也能承受这个间隔,我们来看结果
  1) 我还不知道哪个服务器不支持长连接,如果你下载100G的文件,难道不行吗?中间非得断开n次?
  2) 你的每个客户端需要在10秒之内,发出新的请求,让服务器进行响应,我的则不需要
  3) 轮询操作要注意并发问题,也就是同步访问问题,你的数据得保存在application或者其它自定义全局数据结构里面,而多线程不存在这个问题
  4) 轮询属于单线程,统一处理,而长连接为多线程
  5) 客户端每次请求刷新后断开连接,可以减少占用服务器的连接数,提高并发数,但相对增加了每次请求的负担。
4 关键区别:如果要求在0.1秒内必须做出精确反应,发现连接断开要马上进行处理,我想我的多线程方案会更有效,因为浏览器很难在那么短的时间内发出10次请求的。而长连接则只需要减少发送数据的间隔就可以。

 

总结:
需求决定应用。
系统要求的判断超时的时间越短,长连接的方案优势越大,时间越长,轮询的可用性越强。具体需要根据应用做抉择。
对于一般的B/S判断,大部分聊天室和在线人数统计都是临行轮询操作的。一个人离开聊天室,不会立即更新在线列表,但IM程序(QQ/MSN)等则会相对非常精确的更新。

如果需要精确判断,我想长连接是我能想到的解决方案之一;另一个就是客户端插件,比如applet,Flash,ActiveX等使用socket进行了,不过机制和长连接没有区别。
两点小建议

1。 做到0.1反应可以,但做到0.1秒“精确”反应不行。TCP协议虽然是长连接,但没规定CS中一端掉线时,另一端迅速可知(否则也不会有后来TCP不太标准的“心跳”协议),这关乎中间网络硬件的支持。现实中也是如此。 当然,我不知道版主这篇文章的可能还有上文,所以不知这系统准备运行在什么网上。

2。 文章既然提到“前面页面”。看来这个系统就不应该是QQ或游戏服务器了,后台很可能就是运行一个普通的WEB服务器,IIS或APACHE。。它们的设计目标明确,所以都会有最大连接数限制。表面上,数千人同时在线,没关系,由于采用短连接,同一时间的并发数通常够用。但如果就算客户不活动,连接也要保持,那这个数目就很快有个死限了。
就算游戏或IM工具,典型如QQ,也不敢用TCP来长连接服务器。

所以我的总结是,如果准备做一个最多就1,2百人左右同时上线(而不是同时活动),那可以采用楼主的方法。如果人数一涨,则包括flash, activeX, socket ...统统不可能用长连接,宁可用UDP去碰。

Javascript 相关文章推荐
jQuery 动态酷效果实现总结
Dec 27 Javascript
基于jQuery的简单的列表导航菜单
Mar 02 Javascript
jquery操作checked属性以及disabled属性的多种方法
Jun 20 Javascript
jQuery插件jFade实现鼠标经过的图片高亮其它变暗
Mar 14 Javascript
JavaScript数据推送Comet技术详解
Apr 07 Javascript
JavaScript lodash常见用法系列小结
Aug 24 Javascript
webpack使用 babel-loader 转换 ES6代码示例
Aug 21 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
Nov 11 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
Aug 25 Javascript
jQuery zTree树插件的使用教程
Aug 16 jQuery
Layui表格行工具事件与数据回填方法
Sep 13 Javascript
React实现轮播效果
Aug 25 Javascript
JS写的数字拼图小游戏代码[学习参考]
Oct 29 #Javascript
JavaScript函数、方法、对象代码
Oct 29 #Javascript
js身份证验证超强脚本
Oct 26 #Javascript
javascript引导程序
Oct 26 #Javascript
javascript笔试题目附答案@20081025_jb51.net
Oct 26 #Javascript
Div自动滚动到末尾的代码
Oct 26 #Javascript
Firefox getBoxObjectFor getBoundingClientRect联系
Oct 26 #Javascript
You might like
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
javascript中Object使用详解
2015/01/26 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
2016/04/17 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
体育教育专业毕业生自荐信
2013/11/15 职场文书
竞聘上岗演讲稿范文
2014/01/10 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
民政局未婚证明
2015/06/15 职场文书
繁星春水读书笔记
2015/06/30 职场文书