Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 让socket.io客户端版本落后于服务器版本 处境_Sockets_Go_Websocket_Socket.io - Fatal编程技术网

Sockets 让socket.io客户端版本落后于服务器版本 处境

Sockets 让socket.io客户端版本落后于服务器版本 处境,sockets,go,websocket,socket.io,Sockets,Go,Websocket,Socket.io,我们正在使用socket.io进行移动服务器通信。因为我们不能强制升级用户的设备,如果我们想升级到版本1(不向后兼容),我们必须在服务器上处理这两个版本一段时间 问题: 有哪些选择 我目前最喜欢的是将旧版本和新版本包装在多路复用器中。它根据头和查询参数检测传入请求的版本,从而知道要调用哪些函数 另一个(shittier)选项是将新版本封装在一个模块中,该模块可以在必要时将协议的旧版本转换为新版本(然后再转换)。这有一个严重的缺点。要确保我正确地确定和处理了所有微小的差异,这将是一项耗时且不确定的

我们正在使用socket.io进行移动服务器通信。因为我们不能强制升级用户的设备,如果我们想升级到版本1(不向后兼容),我们必须在服务器上处理这两个版本一段时间

问题: 有哪些选择

我目前最喜欢的是将旧版本和新版本包装在多路复用器中。它根据头和查询参数检测传入请求的版本,从而知道要调用哪些函数

另一个(shittier)选项是将新版本封装在一个模块中,该模块可以在必要时将协议的旧版本转换为新版本(然后再转换)。这有一个严重的缺点。要确保我正确地确定和处理了所有微小的差异,这将是一项耗时且不确定的工作。有些差异可能需要认真按摩


(如果你好奇或者知道这有帮助,我们正在围棋中做这件事。)

我真的没有立即的解决办法,但我有一些建议。我想你可以用它来节省很多时间

  • 首先,我在一家初创公司工作,该公司使用socketIo的时间几乎
    一切
  • 我们知道这个问题会发生,所以我们最初的设计是
    使一切都可插拔,这意味着我们可以将socketio换成
    sockjs,它仍然可以工作
  • 其实现方式是定义一组很少更改的通用API
    在一个系统中。我们称之为经理。管理者只需公开其余开发人员需要使用的API,而不会造成任何混乱。它加速了很多
  • manager的实现在后台发生了变化,但API仍然是相同的,因此从事核心工作的工程师可以自信地进行更改
  • 似乎您的代码中有一个紧密的依赖关系。也许不是。我不太确定。如果你没有遵循这个原则的话,试着去做

您似乎可以在服务器上运行两个不同版本的socket.io。由于这两个版本没有唯一的模块文件名,您可能需要从不同的路径加载一个版本。显然,当加载模块并初始化它们时,您会将它们分配给不同的命名变量。例如:

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