V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
lerry
V2EX  ›  分享创造

分享一篇自己写的关于 ajax 长连接的文章

  •  
  •   lerry ·
    lerry · 2015-01-08 12:46:31 +08:00 · 4977 次点击
    这是一个创建于 3626 天前的主题,其中的信息可能已经有所发展或是发生改变。
    11 条回复    2015-01-09 22:30:31 +08:00
    xinyu198736
        1
    xinyu198736  
       2015-01-08 13:23:37 +08:00
    概念有些混淆
    typcn
        2
    typcn  
       2015-01-08 13:28:49 +08:00
    不就是 socket.io ,连接 websocket 失败的时候自动降级的那个吗。。。

    现成全自动的,不用造轮子。。
    airyland
        3
    airyland  
       2015-01-08 13:33:19 +08:00
    这叫轮循,不叫长连接吧。websocket才叫长连接。
    xinyu198736
        4
    xinyu198736  
       2015-01-08 15:56:30 +08:00
    @airyland 长连接是 long polling ,跟socket不是一个概念,另外楼主这个只能叫做“超时连接”,跟long polling还沾不上太大的边。
    meeasyhappy
        5
    meeasyhappy  
       2015-01-08 16:04:48 +08:00
    给你赞一个
    jc4myself
        6
    jc4myself  
       2015-01-09 00:47:18 +08:00 via iPad
    ajax更多是异步的,异步就不会使用长链接
    lerry
        7
    lerry  
    OP
       2015-01-09 09:58:06 +08:00
    @xinyu198736
    @typcn
    @airyland
    @jc4myself

    感谢指教~
    我写的是关于long polling,字面上看叫长轮询更恰当一些,

    我理解的
    轮询,定时向服务器请求,服务器立即响应,
    长连接/轮询,服务器收到请求后,挂起,直到有新消息才返回, 但是为了连接的维持,设置了超时时间,同时服务器会在一定时间内返回

    可以看这里
    http://stackoverflow.com/questions/14903223/why-setting-a-client-side-timeout-when-using-long-polling

    求教 @zythum
    hitsmaxft
        8
    hitsmaxft  
       2015-01-09 10:05:29 +08:00
    @jc4myself 错 异步又不影响网络请求模式
    zythum
        9
    zythum  
       2015-01-09 11:48:18 +08:00
    我说下我的理解。可能也不是很正确。

    长链接的链接一般是不中断的。使用http协议的Transfer-Encoding:chunked方式输出。一般实现是使用一个iframe发起请求(XMLHttpResquest貌似没发使用chunked)。然后通过脚本<script>parent.xxxxxxxx</script> 来处理,还是直接用iframe作为显示就随便。

    长轮训一般使用XMLHttpResquest, 处理是发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求。然后等到服务器响应(包括超时),之后再次发起一个请求...

    特点是长链接的链接只有一个。长轮训的链接有多个。对于实时性来说。长链接更好。

    轮询,就是 setInterval(sendRequest, 500)。 定时请求一下就好了。

    以上都是基于http协议而言的。websocket不是http协议。是一个同样是tcp的协议。websocket和http起的服务时不一样的。

    @airyland 一般来说。长轮训,长连接是特指上面的两种实现方式。如果从原理来说。即保持一个链接不中断。那么websocket也是这样的。

    @typcn 这个方式很早就有了。互联网刚开始都是在线聊天室的时候都是这样处理的。

    @jc4myself 异步不一定只是XMLHttpResquest. Ajax不单是XMLHttpResquest

    字写太多了。估计有错别字。求谅解。
    zythum
        10
    zythum  
       2015-01-09 11:56:18 +08:00
    还有一个需要说的是websocket是双工的。可以通过同一个链接上行下传。 长连接单工的。只能实现服务端下传。
    tamamaxox
        11
    tamamaxox  
       2015-01-09 22:30:31 +08:00 via Android
    不如先看看meteor的方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3362 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:28 · PVG 18:28 · LAX 02:28 · JFK 05:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.