聊天应用程序:成功重新连接到 WebSocket 服务器后该怎么办?

Posted

技术标签:

【中文标题】聊天应用程序:成功重新连接到 WebSocket 服务器后该怎么办?【英文标题】:Chat app: What to do on successful re-connection to the WebSocket server? 【发布时间】:2017-11-08 11:46:20 【问题描述】:

我和我的朋友目前正在使用 WebSocket 构建一个基于 Web 的聊天应用程序。我负责客户端(React + Redux)。服务端用的是golang(不知道这个组合好不好用,只是好玩而已)。

基本上我的问题是成功重新连接到WebSocket服务器后不知道该怎么做。

更具体的:

客户端在连接丢失时尝试重新连接到服务器。我的问题是

    重连成功后,本应发送到服务器,却因失去连接而没有发送的数据怎么办?是不是有一个像缓冲区这样的东西来存储所有尚未传输到服务器的数据更好?

    目前,React 组件对componentDidMount 上的所有必要数据(房间、朋友、聊天记录等)进行初始获取。为了使应用程序在成功重新连接时与服务器同步,应用程序应执行类似于初始获取的操作。但是故意调用componentDidMount似乎不是一个好主意,因为它不应该以这种方式调用。首先在componentDidMount 中执行初始提取是否很好?

【问题讨论】:

有没有可能分享repo?我很想知道如何将 Golang 和 React 连接在一起,而你正在做的事情可能会有很大的帮助。谢谢! @KevinGhaboosi github.com/shirasudon 顺便说一句,我们还没有完成实现。 【参考方案1】:

由于这是一个笼统的问题,我将笼统地回答:

    您需要在应用程序和不可靠流之间设置某种缓冲区。由于您是被动的,因此您可以使用 observable 来实现这一点。负责通过 WebSocket 进行实际通信的服务将订阅此提要。

    将组件的初始化与数据的初始化分开。如果您通过 WebSocket 进行通信,则可以在每次套接字连接时重新初始化数据。

【讨论】:

感谢您的快速回复。关于第二个答案:我在初始获取时使用普通 HTTP 连接而不是 WebSocket。那么,要在每个套接字连接上初始化数据,我应该在初始获取时使用 WebSocket 吗? 没关系;如果您认为重新连接后您的初始数据仍然正常,您甚至不需要重新获取它。如果不是,您可以使用 websocket 的连接事件并使用任何方法获取。【参考方案2】:

Go 对于聊天服务器来说无疑是一个不错的选择,因为它处理并发的方式。聊天服务器的另一个常见选项是 Erlang。 React 是个人喜好问题。

    您可能不想全部缓冲。您只想缓冲消息,而不是,例如,键入指示符,因为如果不立即发送它们就没有意义。像push()shift() 这样简单的数组就可以了。

    将数据获取移至单独的函数,然后从 componentDidMount 和回调或您重新连接的任何位置调用它。

在一个应用程序中同时使用 HTTP 和 websocket 是设计问题。不过,这似乎确实使事情复杂化了。

【讨论】:

感谢您的回答!您是否认为,在服务器端渲染方面,最好同时使用 javascript (NodeJS) 构建客户端和服务器端?我知道有一个带有服务器端渲染功能的 Golang 包,但我认为使用 NodeJS 仍然更好,因为您可以简单地在客户端和服务器端之间共享一些代码。聊天应用中经常使用 Golang 和 Erlang 是否仅仅是性能原因?

以上是关于聊天应用程序:成功重新连接到 WebSocket 服务器后该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 android 连接到可操作的 websocket 连接?

如何在NodeJS中代理websocket连接到其他websockets

iOS WebSocket 未使用 SocketRocket 连接到服务器

不断重新连接到 websocket / 会话 ID 未知 / Etherpad

关闭连接后如何重新连接到websocket [重复]

在 redux-Saga 中重新连接到 webSocket 服务器的标准方法?