`
xiukongtiao
  • 浏览: 1135 次
文章分类
社区版块
存档分类
最新评论

Websocket不是拯救世界的未来战士,那socket.io呢?

阅读更多
今天在微博上看到朋友们在讨论关于各种web推送技术的话题,心里一阵唏嘘,触景生情,想想觉得自己还真是与这个叫做“web推送”的技术渊源颇深,有必要就这个话题唠叨两句,来回顾自己的青春,若是这篇乱弹,能对刚接触这个东西的年轻朋友有些启示,也算哥肚皮上累积了7年的脂肪没有白长。

Web项目里,其实有好几个场景都非常需要这个技术,比如:实时在线用户列表,聊天,文件上传的进度条,在页面上实时显示系统日志,web页面同步。哥几乎经历和使用过这个领域常用的所有技术,从早期自己实现轮询,长轮询,piggyback, IFRAME,到后来的flex插件, DWR。以及现在websocket和封装的相对成熟的socket.io等等,虽说软件技术更新快速,但说实话,对这个领域的发展让人真的很不爽,这么多年过去了,直到今天还有没有那一种,让人在这个问题上真正省心。写到这里,基本上是进入一个吐槽的情绪,在正式吐槽之前,先撤点温情的话题吧,毕竟开头都说了这个文章主要是回顾自己的青春。

开始之所以说自己与“推送”颇有渊源,一是因为在过去的几年,在多个项目中,自己多次用不同的方式都用过相关的技术。二来,自己有两个有趣的经历与此相关。

先说有趣的经历吧:

第一段经历是,当年加入京东商城研究院面试的时候,面试官让我介绍了自己了解的web推送技术,刚好这些技术,我全部都用过,把自己从长轮询,iframe 到flex插件的各种使用经历都告诉了他,最后又展望了一下那时候还没有出来的websocket,面试官相当满意,我相信最后能拿到offer,这个问题起了很大的作用。

第二段是,在09年的一天,DWR的创始人,竟然出现在我的办公室,没错,就是他-DWR的创始人,来到了我在成都的办公室,原因是他是我老板朋友,所以来中国的时候,就过来玩玩,令当时还比较年轻的我,不可思议,一是自己无论如何没想到竟然能接触到那个时代最有影响力的团队,二来这个传说中的大牛其实是一个只有20多岁,有点腼腆的小伙子,真是没想到啊。有朋友要问,DWR是啥? 让哥告诉你把,08年前后全世界java社区最流行的ajax框架之一, 所谓的”反向ajax”,英文叫“Reverse Ajax”应该就是这个团队发明出的一个唬人的名词。虽然DWR看着很光鲜,其实BUG也是蛮多的,尤其是反向AJAX这一块,我们团队就帮他打了不少的patch。

OK,咸淡扯完进入正题。 网上关于实现轮询,长轮询,iframe stream、如何使用flex插件进行通信,以及如何使用DWR, websocket如何使用,socket.io+ node.js 如何使用的文章多如牛毛,中间也不乏优秀程序员的精品文章,因此关于具体使用方面的问题,这里就不再赘述,需要的朋友google一下,就很容易找到满意的方案。

今天这里主要使用吐槽方式,将自己过去几年里,在各种推送技术的使用中遇到的问题,和大家一起分享,以示对这个领域技术发展缓慢的不爽!!!!

一说到吐槽web推送技术,大家肯定就会说各种浏览器对 websocket的支持越来越好了,这个问题早就不是问题了,但真的就不是问题了吗?

那咱们就从这个该死的websocket开刀,曾几何时,websocket是每个程序员心目中的共产主义,想着有了websocket的一天,我们就可以很轻松的实现进度条,聊天等等功能。今天,从IE10, firefox, safari,chrom几乎所有浏览器的最新版本已经支持了websocket,可是,美好的一天真的到来了吗? 哥不是这方面的专家,只说说哥在使用websocket中遇到的各种血泪史:

  • 哥要实现一个在线用户列表,但如果直接使用websocket,服务器端却没有一个API准确的告诉哥,客户端的在线状态,哥不得不像傻逼的一样每隔几秒钟发一个PING,去检测一个客户端的是否在线,并通过超时的方式来维护整个在线用户列表。至少从程序员的工作量上,这并没有比轮询或长轮询节约任何时间。
  • 从后台发送一条消息到客户端,服务器端并无法知晓消息是否到达客户端,为了确保每一条消息到达,你就不得不在客户端做一些该死的额外工作:发送一个确认消息回去,让服务器知道,这条消息到达。如果你的功能要求每条消息必须到达,你的活儿就更多了,你还需要实现消息在服务器端的缓存,以备客户端网络不好时,需要重发,这些活儿可都不少啊。


这里只是讲了最常见的两个恶心的问题,其实在具体实践中还有更多更恶心的问题,比如客户端要定时检测网络,网络断开的时候还要自己重连; 要确保消息到达但还不允许重复发送,就需要更多的握手来确保,等等等各种恶心的问题,这其实是有很多活儿要干的。

至少从程序员的工作量上来说,相比其他的技术,websocket就没有带来任何的福利,此时此刻,真的很想说F开头的词语。更重要的是,至少在中国大部分系统还需要支持没有websocket的浏览器。

以上提到的这些问题websocket存在,long polling这些较早期的技术也同样存在。

Websocket根本不是未来战士,他拯救不了世界!

很多人可能觉得这家伙吹毛求疵,要求太高,但哥跟你的观点不同,别忘了现在是21世纪,各种推送技术已经发展了十几二十年,就这么简单一个东西,到今天为止,依然不能让大家省心,这真的令人费解,我相信很多程序员跟哥一样,不关心底层的实现,就需要一个像JDBC一样简单的东东,一两个小时让一个系统具备一套相对完整的推送功能,那么什么样的功能算是相对完整呢,哥认为,一个合理的推送技术,期望是这样(欢迎其他朋友补充):

1.客户端在线的时候,每条消息确保到达。
2.客户端网络掉线,服务器要有API及时准确捕捉。
3.服务器挂掉时,客户端有API及时捕捉。
4.客户端掉线后,一旦网络恢复,客户端可以自动重连。
5.断线期间的消息,在重连后能立即自动补发,确保每条消息不丢失。
6.能兼容所有浏览器,不论这个浏览器是否支持websocket。
7.像JDBC一样简单,一年经验的程序员一两个小时就能用起来。

大家可能又要说了,socket.io就可以自动重连,又支持所有浏览器。但我想告诉你的是socket.io也同样不是一个省油的灯。

如果你要使用socket.io,那么你就要会用node.js,或者其他语言实现socket.io通信协议的后台程序。Node.js的工作量可不少,哪怕你是一个非常熟练的js程序员,想在一个月内开发一套非常稳定完善的系统都不是一件容易的事情。如果你刚好又是新手,你连NPM是什么都不知道,那恭喜你,不经历一番学习,你是不容易在短期内做出这样的功能。

更具体的是,socket.io团队的对项目的支持效率很低,在低版本浏览器的支持上还有不少的问题,而且修复的很慢,至少哥给他们报的BUG一直没人理睬,想想也是要哭了!

Fxxk,哥就是想在一个预算只有几万元,开发周期只有一两周的项目中加一个简单的文件上传的进度条,真的就有这么困难吗? 没错,如果您要实现一个稳定的功能,他就真没办法这么简单的搞定,这个东西就是这么Fxxk!

想想这么多年过去了,各种技术更新换代,但就这么一个九十年代就存在的看起来不难的问题,20年过去了,依然没有能够是没能很好的解决,这难道不是一个巨大的悲剧吗!!!!

我是不是正在把你带向一个万劫不复的恶劣情绪?呵呵,请不要太入戏了,哥说的的是,目前没有一个成熟稳定的技术,能让程序员一两个小时就能将一个稳定完善的功能跑起来。哥强调的是:轻松、容易、短时间,稳定完善。

这个东西真的很难吗?当然不是,哥就曾经用DWR和socket.io都分别开发出来过很稳定的推送功能,当然时间也是花了不少,不论是自己开发,还是对社区中开源的项目进行二次开发,投入适当的人力和一定的时间,开发一个相对稳定的推送功能当然并非什么难事。

难的是如果你想快速的在一个低成本,开发周期短的项目中实现一个这样的功能,那就真的是个很烦人的事情!!!

每每想到这些,哥就夜不能寐,恨不得瞬间化身为未来战士,拿出一个大招,开发一个小插件从根本上解决这个问题,为社区贡献一点点力量,一直有这样一个想法,但因为各方面的原因,到现在还一直没能开始。

在我的大招出来之前,个人觉的一个稳定可靠的第三方推送服务可能是现阶段比较稳妥的一个选择,所以哥自己动手搞了一个web推送服务,放在亚马逊的云服务上,供大家免费使用,网址是https://goeasy.io 为了发扬国际共产主义精神,所以版面选择了英文版,国外也有许多蛋疼的朋友,需要帮助啊,当然咱也是撰写了完整的中文文档可供下载。希望大家多提建议,对大家也能有所帮助。

关于web推送的话题,欢迎大家热烈讨论!

开发一个插件从根本上解决这个问题,也已经列入计划,对这个新插件我的期望是:
1.不需要学习node.js类似的后台技术
2.使用简单,半小时跑起来

期望这个小插件能在2016年早日与大家见面,欢迎大家关注我的博客,敬请期待。
分享到:
评论

相关推荐

    socket.io,socket.io-client下载

    Socket.IO和Socket.IO-Client是两个非常重要的库,主要用于实现实时双向通信,尤其是在Web开发领域。它们使得JavaScript客户端(浏览器)与Node.js服务器之间能够建立WebSocket风格的连接,提供了强大的实时通信解决...

    weapp.socket.io

    "weapp.socket.io"是一个专为微信小程序(WeChat Mini Program)定制的Socket.IO实现,它使得在微信环境中可以利用WebSocket进行实时通信。Socket.IO是一个流行的JavaScript库,它提供了跨平台、跨浏览器的实时应用...

    socket.io.js下载

    Socket.IO 是一个实时应用程序框架,它为Web开发者提供了一种简单、高效的通信方式,支持WebSocket以及其他多种协议。在本文中,我们将深入探讨Socket.IO的核心概念、功能以及如何使用socket.io.js文件。 WebSocket...

    Socket.IO.min.js

    Socket.IO.min.js 是 Socket.IO 库的压缩版本,用于在客户端(浏览器)中实现 WebSocket 的通信功能。 内容概要: Socket.IO.min.js 是 Socket.IO 库的一个压缩版本,通常包含了实现 WebSocket 通信所需的所有核心...

    weapp.socket.io.js.zip

    总的来说,"weapp.socket.io.js.zip" 提供了一个在微信小程序中实现WebSocket通信的解决方案,通过封装和适配Socket.IO,让开发者能够利用其强大的功能来构建实时的应用程序。在使用这个库时,开发者应该结合微信小...

    swift-socket.io-client-swiftSocket.IO客户端

    Swift Socket.IO客户端是针对iOS和macOS平台的实时通信解决方案,它基于Socket.IO协议,提供了强大的双向、基于事件的通信功能。Socket.IO旨在克服WebSockets的一些限制,为开发者提供更稳定、更灵活的实时应用开发...

    基于socket.io聊天室功能

    基于 WebSocket 协议,Socket.IO 提供了更高级别的接口,能够处理各种网络条件下的连接问题,确保数据的可靠传输。在这个“基于socket.io聊天室功能”的项目中,我们将探讨如何使用 Socket.IO 构建一个简单的聊天室...

    微信小程序socket.io客户端, 支持微信小程序、支付宝小程序socket.io-mp-client-master.zip

    这个名为"socket.io-mp-client-master.zip"的压缩包包含了专门为微信小程序和支付宝小程序设计的Socket.IO客户端库,名为"socket.io-mp-client"。 1. **WebSocket协议**:Socket.IO基于WebSocket协议,WebSocket是...

    小程序socket.io客户端, 支持微信小程序、支付宝小程序.zip

    1. **引入socket.io-client库**:由于微信小程序不支持直接引入npm包,你需要先将socket.io-client库转换为小程序可用的格式,这通常通过Babel或者其他构建工具完成。然后将转换后的文件上传至微信开发者工具的项目...

    socket.io API文档

    ### Socket.IO API 文档知识点详解 #### 一、Socket.IO简介 Socket.IO 是一个非常流行的JavaScript库,它能够实现浏览器与服务器之间的实时双向通信。它不仅支持WebSocket协议,还能够通过其他方式(如轮询)作为回...

    用java写socket.io客户端所需jar包

    Socket.IO 是一个实时应用框架,它为开发人员提供了一种简单的方式来实现在Web上进行双向通信,即服务器和客户端可以实时、双向地交换数据。在Java中创建一个Socket.IO客户端,你需要依赖一些特定的库来处理相关的...

    session.socket.io, 在 socket.io 中,表示/连接会话.zip

    session.socket.io, 在 socket.io 中,表示/连接会话 session.socket.io ( SessionSockets ) 这个小模块简化了 socket.io 使用express或者连接中间件的http会话的使用。 它没有依赖项,可以使用任何与表示或者连接...

    socket.io iOS Demo(含cookie及query参数配置)

    总之,socket.io为iOS开发者提供了一种强大而灵活的方式来实现WebSocket通信。通过理解和实践这个Demo,你不仅可以掌握基本的用法,还能了解到高级特性,如cookie和query参数的配置,这将有助于你构建更复杂的实时...

    socket.io不错的websocket

    标题 "socket.io不错的websocket" 暗示了我们要讨论的是WebSocket技术的一种实现——Socket.IO。WebSocket是一种在客户端和服务器之间建立持久性连接的协议,它允许实时双向通信,非常适合需要实时交互的应用,如...

    node.js+socket.io离线包+聊天室源码

    这是基于socket.io实现双向实时通信的聊天室样例。来源于网上的博文,我对源码做了一些增强,并把需要的node.js、socket.io、jQuery、服务端和客户端源码,全部打在一起(node.js的npm需要在线安装,聊天室样例也有...

    socket.io.js

    2. Socket.IO的核心概念:Socket.IO不仅仅是一个WebSocket库,它还提供了许多附加功能,如自动重连、错误检测、事件驱动的API以及多种传输协议的支持。它会根据浏览器和服务器的兼容性选择最佳的通信方式,从而简化...

    socket.io的demo

    Socket.IO 是一个实时应用框架,它为开发人员提供了一种简单的方式来实现实时、双向通信。这个框架在Web上广泛使用,特别是在构建实时聊天、协作工具或者任何需要实时数据交换的应用场景。WebSocket协议是实现此类...

    Cocos Creator 3.x 中使用 Socket.io

    Cocos Creator 3.x 中使用 Socket.io Cocos Creator 3.x 中使用 Socket.io 文档地址:https://blog.csdn.net/nicepainkiller/article/details/127239678 文档地址:...

    Socket.IO demo程序

    Socket.IO 是一个实时应用框架,它为开发人员提供了一种简单的方式来实现在Web上进行双向通信,即服务器和客户端之间的实时、低延迟的数据传输。在Java环境中,我们可以使用Socket.IO的Java客户端库来构建这样的应用...

    在 Java 上实现的 Socket.IO 服务器 实时java框架

    该项目是Socket.IO服务器的开源 Java 实现。基于Netty服务器框架。 根据 Apache License 2.0 获得许可。 支持1.x - 4.x版本的Socket.IO 客户端 支持 xhr 轮询传输 支持websocket传输 支持命名空间和房间 支持ack...

Global site tag (gtag.js) - Google Analytics