客户端的两个具有不同路径的套接字连接与第二个连接重叠
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());
根据列表的条件,我有两个客户端连接在颤振中, 和服务器有两个服务器套接字,具有不同的端口和不同的握手路径,以便客户端轻松连接。
服务器:
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());