为什么我的 Flutter 应用程序无法连接到我的本地 nodejs 服务器?

时间:2020-12-23 19:11:47

标签: node.js flutter socket.io

我正在学习 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,现在它可以工作了。我认为网络政策有问题。

2 个答案:

答案 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。