客户端的两个具有不同路径的套接字连接与第二个连接重叠

Client's two socket connection with different path overlaps the second connection

根据列表的条件,我有两个客户端连接在颤振中, 和服务器有两个服务器套接字,具有不同的端口和不同的握手路径,以便客户端轻松连接。

服务器:

Name     | Port | Handshake path 
Socket A | 3001 | /one
Socket B | 3002 | /two

所以当从 flutter 应用程序连接时,无论我先打开哪个 listItem,都会建立与指定握手路径的连接。

Items | HandshakePath
Item1 | /one
Item2 | /two
Item3 | /one

对于上述情况,当我单击项目 1 时,它与服务器上的 /one 套接字建立连接并且一切正常,但之后当我单击项目 2 时仍然在 /one 路径上创建连接,反之亦然,无论先建立哪个连接,都会保持连接并与第二个连接重叠。

连接 Class 1

Class One{
 IO.Socket _socket;
 connect(){
 _socket = IO.io(
        deployment ? _serverIP : SERVER_ONE,
        IO.OptionBuilder()
            .setTransports([
              'websocket'
            ]) 
            .setQuery({
              "info": _fromUser,
            })
            .setPath(deployment ? "/one" : "/socket.io")
            .disableAutoConnect()
            .build());
 }
}

连接Class 2

Class Two{
 IO.Socket _socket;
 connect(){
 _socket = IO.io(
        deployment ? _serverIP : SERVER_TWO,
        IO.OptionBuilder()
            .setTransports([
              'websocket'
            ]) 
            .setQuery({
              "user1": _fromUser1,
              "user2": _fromUser2,
            })
            .setPath(deployment ? "/two" : "/socket.io")
            .disableAutoConnect()
            .build());
 }
}

与本地服务器的连接工作正常,我猜这是因为 ENV 变量中提到的不同端口,但在服务器上,我已经根据路径设置了路由转发到不同的端口。

在 discord 社区的帮助下,我找到了可行的解决方案。

当我们使用 socket_io_client 在 flutter 中创建第一个套接字客户端连接时,我们提供的任何 Option Builder 值都将在我们将创建的每个实例中使用,即使我们提供不同的值也会使用它仅以前的值。在那种情况下,

我们必须使用 enableForceNew() 方法来提供不同的值

  _socket = IO.io(
            deployment ? _serverIP : SERVER_TWO,
            IO.OptionBuilder()
                .enableForceNew() // <--- this method
                .setTransports([
                  'websocket'
                ]) 
                .setQuery({
                  "user1": _fromUser1,
                  "user2": _fromUser2,
                })
                .setPath(deployment ? "/two" : "/socket.io")
                .disableAutoConnect()
                .build());