• 2014-07-28

    HTTP 长连接技术 Comet

    Views: 13717 | 3 Comments

    人们常常提到"Comet", 或者"Web 服务器推", "HTTP 长连接", 事实上, 他们指的是同一件东西, 可以统称为 Comet 技术. 但是, Comet 技术又不是单独的一种东西, 而解决某一个问题的许多技术的统称. 要解决的问题是 Web 服务器向浏览器实时推送数据, 而解决方案有很多种.

    最经典的方案是 AJAX 轮询, 这种方案和"推"技术毫无关系, 只是由于轮询的间隔比较短, 如一两秒, 便给了用户实时的错觉.

    新下来是安装浏览器插件, 如 Active-X, 或者使用 Flash 插件, Java Applet 插件等, 这些方案都不通用, 兼容性不好, 也不能被称为 Comet 技术.

    根据实践, 真正的 HTTP 长连接方案主要有: Script Tag Long-Polling, Forever Iframe, WebSocket. 这些方案在我的另一篇文章"各种 Comet 技术优缺点对比"有介绍.

    对于开发者, 为了快速和方便的开发, 应该选择一个支持 Comet 技术的 Web 服务器和一套 JavaScript 库. iComet 就是这样的一套解决方案.

    iComet 开源项目: https://github.com/ideawu/icomet
    iComet Demo: http://www.ideawu.com/icomet/chat/

    Posted by ideawu at 2014-07-28 08:46:23 Tags: ,
  • 2014-05-09

    热烈庆祝icomet成为oschina推荐项目!

    Views: 25363 | 4 Comments

    最近, icomet 项目成为了 oschina 的推荐级项目!

    同时, icomet 更新了聊天 demo(立即试用):

    • 美化界面, 更好看了.
    • 增加好友列表, 能显示全部好友和最近联系人.
    • 离线存储消息.

    这个 demo 同时支持 Web 端和手机端, 使用 SSDB 作为持久化存储服务, 存储好友列表, 最近联系人和消息历史. 对于想开发跨终端 IM 的同学, 这个项目的代码值得你常常.

    icomet 项目主页: https://github.com/ideawu/icomet
    icomet-demo: https://github.com/ideawu/icomet-demos
    SSDB: https://github.com/ideawu/ssdb

    Posted by ideawu at 2014-05-09 23:01:03 Tags: ,
  • 2014-04-20

    为什么iComet比nginx-push-stream-module更好?

    Views: 18478 | 9 Comments

    有些项目需要使用"Web服务器推(comet)技术时, 便因为 Web Server 用的是 Nginx 便选择了 nginx-push-stream-module, 但是根据我们的使用经验, nginx-push-stream-module 非常坑, 只适合同时在线几千人的小网站使用. 下面对比 iComet 服务器和 nginx-push-stream-module:

    1. 安全和验证问题

    nginx-push-stream-module 本身没有安全验证机制, 客户端和浏览器可以随意订阅任意通道(channel). 如果想加入验证, 就要使用 nginx + lua 了, 一般的模式是通过 HTTP 访问其它的接口进行验证.

    相比较而言, iComet 自带了 token 验证机制, token 通过业务服务器来分配, 业务服务器可以进行业务相关的权限验证, 如账号密码, 好友关系等等. 一旦 token 生成之后, 验证过程不需要依赖第三方, 全部在 iComet 内部, 所以速度非常快.

    Continue reading »

    Posted by ideawu at 2014-04-20 20:49:05 Tags:
  • 2014-04-15

    iComet 0.2.2.1 稳定版发布和Android聊天App示例

    Views: 19133 | 2 Comments

    这个版本主要是修复了内存泄露的 BUG, 让 icomet 的内存占用更少了,
    在之前这篇博客里介绍. 对于一个 1 万并发连接的应用, 只需要占用不到 20M 的内存.

    Continue reading »

    Posted by ideawu at 2014-04-15 09:58:58 Tags:
  • 2014-04-12

    Libevent HTTP 内存泄露

    Views: 22441 | 2 Comments

    支持百万并发连接的 comet 推送服务器 icomet 刚刚修复了一个内存泄露的 bug, 这个 bug 是因为不正确地使用 libevent 导致的, 无法用 valgrind 等工具检查出来.

    这个 bug 的原因是这样的, 当客户端请求到来时, 服务器端调用了

    evhttp_send_reply_start();
    

    表示开始向客户端推送数据(使用 HTTP chunked), 最后当 long-polling 结束时, 应该调用

    evhttp_send_reply_end();
    

    来关闭连接, 释放 libevent 的内存. 不过, 如果客户端提前终止了请求, 会导致什么呢? 会导致连接关闭的回调函数被调用, 但是, 在这个回调函数里, 我没有调用 evhttp_send_reply_end(), 所以导致了内存泄露.

    在使用 libevent 的过程中, 发现 libevent 的坑确实不少, 而且它的文档根本没有对类似的地方做特别说明, 没有说明哪些函数必须配对使用, 如何释放内存等.

    Posted by ideawu at 2014-04-12 12:11:44 Tags: ,
  • 2014-04-05

    iComet 的一个应用场景

    Views: 19573 | 10 Comments

    iComet 是我做的另一个开源项目, 已经有不少朋友将 iComet 应用到了 Web IM, 移动 App 等应用的线上生产环境, 前几天还有一位朋友帮忙开发并开源了 iComet 的 Java/Android SDK.

    最近在做一个手机端 App 与桌面 PC 程序联动的项目, 简单来说, 这个软件就是要在手机上进行操作, 并立即根据操作的结果更新 PC 上的程序的响应. 例如在手机上点击了一个按钮, 就要在 PC 上自动打开某个窗口. 其中一个重要的步骤便是从服务器下发指令给 PC 上的应用程序.

    Continue reading »

    Posted by ideawu at 2014-04-05 01:57:00 Tags:
|<<<12>>>| 1/2 Pages, 10 Results.