日期:2014-05-16  浏览次数:20378 次

求 长连接 介绍
1. 长轮询(long- polling) :基本原理是客户端向服务器发送请求,服务器接到请求后hold 住连接,直到有新消息才返回响应信息并关闭连接,连接被断开期间用户的新信息会被服务器缓存起来。客户端处理完响应信息后再向服务器发送新的请求。这种做法的优势是如果用户一直没新消息,客户端不会频繁的轮询去服务器取消息,节省了流量,但是服务器维持长连接是很消耗资源的。具体实现起来,前端这边基本不需要什么改动,依然是用Ajax 轮询取信息,后端需要在没有新消息时处理一下。

2. 长连接(streaming) :其实很早以前就有人使用这种技术来实现聊天室的通讯。以前在页面中嵌入一个 iframe ,iframe 里放一个使用长连接页面,服务器有新消息就会及时的在iframe 里反映出来,再依靠客户端的脚本解析出来就OK 了。这样做一个比较严重的问题是:使用iframe 请求长连接时,无论是IE 还是firefox 都会认为页面没有加载完而显示进度条,很难看。不过这个问题是可以解决的。firefox 支持了Streaming Ajax ,在readyState 为3 的时候就能接受数据,所以问题不大;IE 则只能在readyState 为4 ,即连接断开时才能得到返回值。但是伟大的Google 工程师使用了一个hack 成功的解决了这个问题:使用一个被称为“htmlfile ”的ActiveX ,把iframe 放在这个 ActiveX 里就OK 了。

问下个 长轮询我还是明个什么意思了
但那个长连接是什么?还道就是个长轮询在iframe里实现还是什么?
求哪个给我分析下长连接

------解决方案--------------------
长轮询
当用户用AJAX访问一个动态文件的时候, 动态文件设置缓存为立即输出. 
并且在X秒中都检测是否有新的消息, 如果没有新的消息, 那么延时. 并输出1字节0字符来保持连接.
如果有新的消息, 那么发送新消息, 并结束这次连接的查询.

长连接
在一个页中放了一个iframe, iframe中打开一个动态文件, 动态文件设置缓存为立即输出,
并且在X秒中都检测是否有新的消息, 如果没有新的消息, 那么延时. 并输出1字节0字符来保持连接.
如果有新消息, 动态文件就输出一个script脚本, script脚本来操作告诉客户有新的消息.


他们都有缺点, 因为IIS同时可执行的动态文件数是有限的, 比如2000同时最多50线程的执行,
他们实现聊天室会导致超过50人时发生问题.

一般情况, 自写一个EXE来实现此功能.
------解决方案--------------------
动态文件设置缓存为立即输出
比如ASP: Response.Buffer = False

他动态文件执行了多少, 就向用户返回多少的HTML代码.

必须循环检测用户是否还在请求这个动态文件: Response.IsClientConnected

如果用户已经不请求这个文件, 那么Response.IsClientConnected将返回假