请教下关于 websocket 的使用

本贴最后更新于 592 天前,其中的信息可能已经水流花落

大概需求是,浏览器一打开页面,就连上 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:我怎么没有找到回帖的地方,每次看帖,都找不到回帖的按钮?

  • golang

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

    410 引用 • 1315 回帖 • 683 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    41 引用 • 156 回帖 • 630 关注

赞助商 我要投放

13 回帖
请输入回帖内容 ...
  • 714593351 1

    这时候你需要 @88250

    回帖在右下角
    QQ 图片 20161021145622.png

    1 回复
  • leedstyh

    哎我去,原来在这了

  • Eddie

    @88250 @leedstyh 这跟轮训有啥区别?

    2 回复
  • 88250 1

    黑客派在处理“广播”类型推送的时候也是遍历会话列表,逐个推送,比如此刻,对应代码

    golang 实现的 WebSocket 应该性能更好,CPU 占用可能会更低,具体的性能测试我没有做过,期待你实战后的分享 :-)

    1 回复
  • 88250

    轮询是客户端发起的 HTTP 请求。

    1 回复
  • meikaiyipian

    @话说,手机端是不是也用的 WebSocket,只是模板不同?

    1 回复
  • 88250

  • Immortal 1

    先用这种方式实现没问题
    后期量真的大了再改成消息队列什么的也不迟

  • leedstyh

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

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

    1 回复
  • leedstyh

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

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

  • 88250 1 赞同

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

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

    另外,

    1. JS 客户端重连用的是这个库 ReconnectingWebSocket
    2. Wide 是一个 golang 的 Web IDE,WebSocket 部分用的也是 grilla 库,可能对你参考价值更大一些

    总之,有什么成果记得分享哦 😄

  • Derobukal 1

    昨天刚用 Netty 写了个在线聊天,用的是 WebSocket,有兴趣可以看这里

  • Xanthus

    我用的不是这个包,不过也是遍历

请输入回帖内容 ...