【问题标题】:Why my Flutter app does not connect to my local nodejs server?为什么我的 Flutter 应用无法连接到我的本地 nodejs 服务器?
【发布时间】:2020-12-23 19:11:47
【问题描述】:

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

【问题讨论】:

  • “本地”是指在一台计算机上还是仅在同一网络中?
  • 电脑上的@MindStudio。
  • 尝试使用您的 node.js 服务器正在侦听的计算机的 IP,而不是 localhost。在本地网络上。

标签: node.js flutter socket.io


【解决方案1】:

我之前遇到过同样的问题,我通过使用运行 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)192.168.2.74:3000 ^”
  • 我刚刚更新了答案。在地址前添加http://
  • 连接。 Flutter 仍然没有连接服务器
  • 当我创建 html 文件并尝试使用 javascript 连接服务器时,它正在工作,但颤振有问题。
  • 我尝试了其他一些软件包,但它们也无法正常工作。
【解决方案2】:

我发现了问题。 Socket-io-client 使用的是版本 2,但我的服务器使用的是 socketio 版本 3。我将版本 3 降级为 2。

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 2017-12-16
    • 2019-05-17
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多