重建 websocket 连接

Remaking websocket connections

我有点担心我目前 connectionswebsocket 的处理方式。

在我的 app 的一页中,我有:

var socket = io.connect('http://my.ip.address' + ':' + '80' + namespace);
socket.on('connect', function () {
            socket.emit('join', { room: 'venue_' + venue_id });
        });

之后我 receive 一些 data 通过 socket 然后移动到另一个页面。在第二页运行后,我再次 return 到第一页,上面的 socket 代码再次运行。

我想知道这是否会导致任何类型的问题?我是否应该在较早的阶段尝试 connect,这样 connection 就不会多次生成?如果是这样,是否可以通过javascript传递socket变量?

我在 server 上使用 flask-socketio

感谢您的帮助。

webSocket 连接不会也不能从一个页面存活到下一个页面。当浏览器移动到新页面时,原始页面中的所有 webSocket 连接都会关闭。

因此,无法将 webSocket 连接从一个页面传递到替换它的页面。

因此,使用 webSocket 连接的一种完全正常的方法是在页面加载时创建套接字。创建一个 webSocket 连接不是一个重量级的操作。最初连接 webSocket 的开销只比一个 Ajax 连接多一点。当然,在它连接后,通过它发送数据是非常有效的(比重新发送相同数据的新 Ajax 请求更有效)。

现在,关于您的具体问题:

I am wondering if this is going to cause any kinds of issues?

不,它不会引起问题。每当页面加载时连接是使用 webSockets 的正常方式。

Should I try and connect at an earlier stage so the connection is not made multiple times?

不,您不能将连接从一个页面传递到替换它的页面。

If so, is it possible to pass the socket variable through javascript?

它可以通过 Javascript 传递给同一页面内的其他功能,但不能传递给将替换该页面的页面。

每个页面都应该创建自己的套接字连接,实际上没有办法解决这个问题,正如@jfriend00 在他的回答中解释的那样。

虽然这不会导致任何问题,但使用 WebSocket 和 Socket.IO 的主要原因之一是服务器和客户端之间的低延迟和低开销交换。如果您的应用程序以需要经常加载新页面的方式设计,那么这些好处将部分被延迟和开销所掩盖,因为必须经常丢弃现有连接,以便在下一个页面加载时重新建立它。我的建议是评估 single-page application 模型是否更适合您的应用程序。使用此模型,整个应用程序加载初始页面,然后不需要重定向到其他页面,从而允许您在应用程序的整个生命周期中保持 Socket.IO 连接。

祝你好运!