我正在学习 nodejs,我想在 flutter 应用程序和 nodejs 服务器之间创建实时通信。都在本地工作。
这是我的 socket.js 文件。我正在使用 express 和 socket io。 (稍后快递。休息)
const app = require('express')()
const http = require('http').createServer(app)
app.get('/', (req, res) => {
res.send("Server is running")
})
//Socket Logic
const socketio = require('socket.io')(http)
socketio.on("connection", (userSocket) => {
console.log('a user connected');
userSocket.on("message", (data) => {
userSocket.broadcast.emit("receive_message", data)
})
})
http.listen(3000,(s)=>{
console.log("server is listening at 3000");
});
我的 Flutter 使用 socket_io_client 包。当我运行我的应用程序时,什么也没有发生,它们之间也没有任何联系。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;
String uri = 'http://localhost:3000';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String message;
IO.Socket socket;
StreamController<String> _socketResponse;
@override
void initState() {
super.initState();
_socketResponse = StreamController();
socket = IO.io(
'http://locaost:3000',
IO.OptionBuilder()
.setTransports(['websocket']) // for Flutter or Dart VM
.setExtraHeaders({'foo': 'bar'}) // optional
.build());
socket.onConnect((data) {
print('connectend');
print(data);
socket.emit('message', 'tester');
});
socket.on('event', (data) => _socketResponse.sink.add(data));
message = 'Hello ';
}
@override
void dispose() {
_socketResponse.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: StreamBuilder<String>(
stream: _socketResponse.stream,
builder: (context, snapshot) {
return Center(
child: Text(snapshot.data ?? socket.connected.toString()),
);
}),
),
);
}
}
编辑: 我将我的服务器文件上传到 Heroku,现在它可以工作了。我认为网络政策有问题。
答案 0 :(得分:0)
我之前遇到过同样的问题,我通过使用运行 node.js 服务器的机器的本地 IP 而不是 localhost 来解决它。问题是,如果您正在运行模拟器,那么由于模拟器的某些配置,它应该从您的网络获取自己的 IP 地址,因此 Flutter 应用程序和您的 node.js 不在 localhost
上。>
您可以根据您的操作系统在网络上找到您的 IP。如果您使用的是 Linux 或 MacOs,那么命令将是 ifconfig
,如果您使用的是 Windows,那么它应该是 ifconfig
。在命令的输出中,您可以找到您的适配器,该适配器将显示您机器的本地 IP。
您会找到 node.js 服务器机器的 IP,您可以在 Flutter 应用程序中更新它。
假设我的本地 IP 是 192.168.0.22 并且 API 在端口 3000 上运行,那么我的网络地址将是 http://192.168.0.22:3000
,您的连接代码将如下所示。
socket = IO.io(
'http://192.168.0.22:3000',
IO.OptionBuilder()
.setTransports(['websocket']) // for Flutter or Dart VM
.setExtraHeaders({'foo': 'bar'}) // optional
.build());
另外我建议你在你的 flutter 应用程序中创建环境文件,这样你就可以从配置文件中加载 addr,因为在大多数情况下本地网络 IP 不是静态的,你需要将 IP 更改为当前的如果问题仍然存在,则为 IP。
答案 1 :(得分:0)
我发现了问题。 Socket-io-client 正在使用版本 2,但我的服务器使用的是 socketio 版本 3。我将版本 3 降级为 2。