• 12 六 2009 /  互联网技术 No Comments

    通常长连接应用的结构思路网上都有很多介绍,但是很多细节并没有透露。最近实现具体的应用时探索了几点细节,记录下来。主要的问题是客户端浏览器要有实时的消息返回,但通常整个链路上都会出现一些设置问题导致的无法实时返回的情况。

    1、nginx服务器代理模式不会实时返回数据

    因为现在主流的web服务器还没有特别适合事件驱动的,所以长连接部分需要单独写server程序,但我们又希望用统一的80端口来做服务端口,所以我用nignx做了前面的代理,根据规则转发长连接请求到后台的独立服务器上。

    于是问题来了,通过nginx转发并不直接回复给客户端,需要数据传输后断开连接,客户端才能收到返回的所有内容。这是后需要将默认的proxy_pass的buffer关掉,有一个属性是proxy_buffering off;关掉以后nignx会直接返回结果而没有缓存等待所有内容都从后台服务器传送完成才返回给客户端。

    2、Chrome浏览器的实时处理数据机制

    Chrome和其他浏览器不一样,如果你一开始返回一个http头,里面表明有很长的数据需要下载,Chrome没有收到一定量数据前,是不会在浏览器中渲染或者执行这些已经下载的数据的,所以导致你无法通过长连接触发你想触发的javascript或一些你想做的操作。

    解决方案是在后台的服务器上判断如果是Chrome来访则要在内容body里面先输出标准的html头部head和body标签,然后后面跟随至少2048个字节的字符,可以随意,我用点符号来填充,然后才是正式的我要输出的内容。这样Chrome收够了2048字节的内容后就会触发对代码的处理工作,后续的代码也就变成实时触发的效果了。这算是一个针对Chrome的hack吧。

    Posted by 羽高 @ 10:36

    Tags: , ,

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.