大概需求是,浏览器一打开页面,就连上 websocket,等待有新消息到来(只读不写),服务器有新消息的话,就向全体在线的浏览器发送消息(只写不读)。

我后端是使用 golang,用了 gorilla/websocket 这个包,参考了他的 chat 的例子,他的大概思路就是把每个连接保存到一个列表,然后有消息时,遍历一下这个列表然后挨个发送( https://github.com/gorilla/websocket/blob/master/examples/chat/hub.go#L43-L50 )。我想请问下这种写法会不会有效率方面的问题,如果连接数很多呢?

以前没接触过 websocket,所以不太了解具体该怎么写,Google 了一下没找到太好的参考。

请教大家,websocket 的应用有没有什么 best practice?

似乎是为数不多的使用了 websocket 的社区(还是有其他的我没发现,介绍下?),站长能否介绍下使用情况。

PS:我怎么没有找到回帖的地方,每次看帖,都找不到回帖的按钮?

Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

有时候 websocket 会重连是怎么回事,偶尔会发生,我看资料说浏览器会自己发 ping,会响应 server 的 ping,我看了下 gorilla/websocket 也有默认的 ping/pong 的 handler,按理说应该不会断开链接。

黑客派也有重连的时候,重连的时候我看见有这个 error: Uncaught INVALID_STATE_ERR : Pausing to reconnect websocket

轮询是浏览器每隔一段时间主动向服务器发送请求,看有新数据没。缺点是:1)如果没有新数据,那也会发起一个请求。2)如果有新数据,服务器也不会立刻发送给浏览器,需要浏览器自己来问,不是真的 realtime。

websocket 是浏览器和服务器建立一个连接之后不断开,服务器有新的数据了,立刻发送给浏览器。

ping/pong 我以前查的时候记得结论是浏览器不一定实现: [Wide] 里面虽然也 自定义了 ping/pong 不过好像实际上并没有什么作用 😂

另外黑客派的链接会时不时断开这个问题的确存在,并且重连时确实就是报的你说的这个错(暂停重连),等有空我好好排查一下,初步估计是 NGINX 代理 WebSocket 时的超时设置有问题。

  • JS 客户端重连用的是这个库 ReconnectingWebSocket
  • Wide 是一个 golang 的 Web IDE,WebSocket 部分用的也是 grilla 库,可能对你参考价值更大一些
  • 总之,有什么成果记得分享哦 😄

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    CentOS (Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    IPFS (InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记 了解更多细节。

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    链书 (Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书目前已经下线,也许以后还有计划重制上线。

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境: IntelliJ IDEA