我正在将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)
})
})
我希望套接字连接应被调用一次以实现正常的数据流。
答案 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库中是不允许的。