用于套接字连接多次触发的socket_io_client

时间:2020-10-16 15:26:52

标签: flutter sockets dart websocket socket.io

我正在将socket_io_client库用于flutter应用程序中的套接字连接。 例如

@override
  void initState() {
    super.initState();
      connectToSocket();
    });

 connectToSocket() {
    Socket socket = io('http://xyxz', <String, dynamic>{
        'query': {"sdsxyz"} // optional
      });
    socket.connect();
     }

在initState调用此方法。 用于插座连接。 但是套接字连接触发器(套接字连接的套接字断开连接)在服务器端多次。

服务器端代码。

const app = require('express')()
const http = require('http').createServer(app)
app.get('/', (req, res) => {
    res.send("Node Server is running. Yay!!")
})
//Socket Logic
const socketio = require('socket.io')(http)
socketio.on("connection", (userSocket) => {
    console.log("Socket connected", userSocket.id)
    userSocket.on("send_message", (data) => {
        userSocket.broadcast.emit("receive_message", data)
    })
})

我希望套接字连接应被调用一次以实现正常的数据流。

2 个答案:

答案 0 :(得分:1)

您在哪里调用socket.connect()是这里的重要部分。如果我们的套接字连接了几次,则可能是在状态更改重新呈现的小部件上触发了您的方法。

尝试将其移至initState末尾调用的新函数:

@override
void initState() {
 super.initState();

 this.connectToSocket();
}

void connectToSocket() {
  ...
}

编辑:您还需要在处置时删除套接字,并使用对套接字的引用:

Socket socket;

@override
  void initState() {
    super.initState();
      connectToSocket();
    });

 connectToSocket() {
    if(socket){ return; }
    socket = io('http://xyxz', <String, dynamic>{
        'query': {"sdsxyz"} // optional
      });
    socket.connect();
     }

 @override 
 void dispose() {
if(socket) {
  socket.disconnect();
}
super.dispose();

}

答案 1 :(得分:0)

对于Flutter:使用socket_io_client
使用属性'transports': ['webscoket']
链接:https://pub.dev/packages/socket_io_client
为什么不支持轮询
'transports':['polling']在Flutter中不支持,默认情况下,该库是为dart网站设计的,但是dart网站并不比Flutter流行。轮询机制是从Socket.io JS移植而来的,该JS是使用Ajax方式实现的,但在dart:io库中是不允许的。