Sockets 让socket.io客户端版本落后于服务器版本 处境
我们正在使用socket.io进行移动服务器通信。因为我们不能强制升级用户的设备,如果我们想升级到版本1(不向后兼容),我们必须在服务器上处理这两个版本一段时间 问题: 有哪些选择 我目前最喜欢的是将旧版本和新版本包装在多路复用器中。它根据头和查询参数检测传入请求的版本,从而知道要调用哪些函数 另一个(shittier)选项是将新版本封装在一个模块中,该模块可以在必要时将协议的旧版本转换为新版本(然后再转换)。这有一个严重的缺点。要确保我正确地确定和处理了所有微小的差异,这将是一项耗时且不确定的工作。有些差异可能需要认真按摩Sockets 让socket.io客户端版本落后于服务器版本 处境,sockets,go,websocket,socket.io,Sockets,Go,Websocket,Socket.io,我们正在使用socket.io进行移动服务器通信。因为我们不能强制升级用户的设备,如果我们想升级到版本1(不向后兼容),我们必须在服务器上处理这两个版本一段时间 问题: 有哪些选择 我目前最喜欢的是将旧版本和新版本包装在多路复用器中。它根据头和查询参数检测传入请求的版本,从而知道要调用哪些函数 另一个(shittier)选项是将新版本封装在一个模块中,该模块可以在必要时将协议的旧版本转换为新版本(然后再转换)。这有一个严重的缺点。要确保我正确地确定和处理了所有微小的差异,这将是一项耗时且不确定的
(如果你好奇或者知道这有帮助,我们正在围棋中做这件事。)我真的没有立即的解决办法,但我有一些建议。我想你可以用它来节省很多时间
- 首先,我在一家初创公司工作,该公司使用socketIo的时间几乎
一切 - 我们知道这个问题会发生,所以我们最初的设计是
使一切都可插拔,这意味着我们可以将socketio换成
sockjs,它仍然可以工作 - 其实现方式是定义一组很少更改的通用API
在一个系统中。我们称之为经理。管理者只需公开其余开发人员需要使用的API,而不会造成任何混乱。它加速了很多李> - manager的实现在后台发生了变化,但API仍然是相同的,因此从事核心工作的工程师可以自信地进行更改李>
- 似乎您的代码中有一个紧密的依赖关系。也许不是。我不太确定。如果你没有遵循这个原则的话,试着去做
var io_old = require('old/socket.io');
var io = require('socket.io);
一旦在服务器上加载了这两个版本,我认为有两种不同的方法可以运行它们
1) 为每个版本使用不同的端口。旧版本将使用默认端口80(无需更改配置),该端口与node.js web服务器共享。较新的版本将在不同的端口(例如端口3000)上运行。然后将socket.io的每个版本初始化为其自己的端口。您的较新版本客户端将连接到运行较新版本的端口
对于在端口80上运行的旧socket.io服务器,可以使用现有的任何初始化,这些初始化可能会挂接到现有的http服务器上
对于在其他端口上运行的新socket.io服务器,您可以单独初始化它,如下所示:
var io_old = require('old/socket.io')(server);
var io = require('socket.io')(3000);
var socket = io({path: "/socket.io.v1"});
然后,在新版本的客户机中,您将在连接时指定端口3000
var socket = io("http://yourdomain.com:3000");
2) 为每个版本使用不同的HTTP请求路径。默认情况下,每个socket.io连接都以如下所示的HTTP请求开始:http://yourdomain.com/socket.io?EIO=xx&transport=xxx?t=xxx
。但是,该请求的/socket.io
部分是可配置的,socket.io的两个独立版本可能各自使用不同的路径名。在服务器上,启动socket.io侦听的.listen()
方法采用可选的选项对象,该对象可以使用自定义路径进行配置,如路径:“/socket.io-v2”
中所示。同样,客户端中的.connect()
方法也接受该选项对象。很难找到这个选项,因为它实际上是一个engine.io选项(socket.io使用),但是socket.io会将选项传递给engine.io
我自己也没有尝试过这两种方法,但我已经研究了如何从客户端和服务器启动socket.io连接,看起来底层引擎支持这一功能,我看不出为什么它不能工作
以下是更改服务器上路径的方法:
var io = require('socket.io')(server, {path: "/socket.io.v1"});
然后,在新版本的客户机代码中,您可以这样连接:
var io_old = require('old/socket.io')(server);
var io = require('socket.io')(3000);
var socket = io({path: "/socket.io.v1"});
这将导致向HTTP URL发出初始连接请求,如下所示:
var io_old = require('old/socket.io')(server);
var io = require('socket.io')(3000);
var socket = io({path: "/socket.io.v1"});
http://yourdomain.com/socket.io.v1?EIO=xx&transport=xxx?t=xxx
这将由HTTP服务器上的不同请求处理程序处理,从而将两个版本分开
仅供参考,socket.io连接URL中的
EIO=3
query参数也可能实际上是一个engine.io版本号,它还可用于识别客户端版本并基于该值“做正确的事情”。我还没有找到任何关于它是如何工作的文档,甚至在engine.io或socket.io源代码中找不到查询参数的位置,因此需要更多的研究作为另一种可能性。我们将继续将0.9.x版本和当前版本作为单独的库保留在服务器。最终,当客户机池或多或少都更新了时,我们只需拔掉0.9.x版本的插头
管理这两个版本的方法是将socket.io服务包装在一个包中,该包将确定将请求传递给哪个包装的socket.io版本。此确定将取决于请求的特性,例如自定义头(可以添加到较新的客户端)以及查询参数和一个版本或另一个版本专门使用的其他头
因为我们使用的是围棋,所以到目前为止还没有通用的agre