sockets - 使用 Socket.io 构建 Flutter 应用程序 : can't listen to or emit msgs to the socket channel

标签 sockets socket.io dart flutter flutter-dependencies

我正在使用带有 flutter 的 adhara 套接字 io 来构建套接字应用程序。 https://pub.dartlang.org/packages/adhara_socket_io 套接字成功连接,但没有监听或向我拥有的事件发送任何数据。 我从 Web 客户端进行了测试,一切正常。

这是我正在使用的库提供的示例代码:

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:adhara_socket_io/adhara_socket_io.dart';

void main() => runApp(MyApp());

const String URI = "http://172.25.1.206:6001/";

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<String> toPrint = ["trying to conenct"];
  SocketIOManager manager;
  SocketIO socket;
  bool isProbablyConnected = false;

  @override
  void initState() {
    super.initState();
    manager = SocketIOManager();
    initSocket();
  }

  initSocket() async {
    setState(() => isProbablyConnected = true);
    socket = await manager.createInstance(
      //Socket IO server URI
        URI,
        //Query params - can be used for authentication
        query: {
          "auth": "--SOME AUTH STRING---",
          "info": "new connection from adhara-socketio"
        },
        //Enable or disable platform channel logging
        enableLogging: false
    );
    socket.onConnect((data) {
      pprint("connected...");
      pprint(data);
      sendMessage();
    });
    socket.onConnectError(pprint);
    socket.onConnectTimeout(pprint);
    socket.onError(pprint);
    socket.onDisconnect(pprint);
    socket.on("ExampleEvent", (data) {
      pprint("news");
      pprint(data);
    });
    socket.connect();
  }

  disconnect(){
    manager.clearInstance(socket);
    setState(() => isProbablyConnected = false);
  }

  sendMessage() {
    if (socket != null) {
      pprint("sending message...");
      socket.emit("ExampleEvent", [
        "Hello world!",
        1908,
        {
          "wonder": "Woman",
          "comics": ["DC", "Marvel"]
        },
        {
          "test": "=!./"
        },
        [
          "I'm glad",
          2019,
          {
            "come back": "Tony",
            "adhara means": ["base", "foundation"]
          },
          {
            "test": "=!./"
          },
        ]
      ]);
      pprint("Message emitted...");
    }
  }

  pprint(data) {
    setState(() {
      if (data is Map) {
        data = json.encode(data);
      }
      print(data);
      toPrint.add(data);
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
          textTheme: TextTheme(
            title: TextStyle(color: Colors.white),
            headline: TextStyle(color: Colors.white),
            subtitle: TextStyle(color: Colors.white),
            subhead: TextStyle(color: Colors.white),
            body1: TextStyle(color: Colors.white),
            body2: TextStyle(color: Colors.white),
            button: TextStyle(color: Colors.white),
            caption: TextStyle(color: Colors.white),
            overline: TextStyle(color: Colors.white),
            display1: TextStyle(color: Colors.white),
            display2: TextStyle(color: Colors.white),
            display3: TextStyle(color: Colors.white),
            display4: TextStyle(color: Colors.white),
          ),
          buttonTheme: ButtonThemeData(
              padding: EdgeInsets.symmetric(vertical: 24.0, horizontal: 12.0),
              disabledColor: Colors.lightBlueAccent.withOpacity(0.5),
              buttonColor: Colors.lightBlue,
              splashColor: Colors.cyan
          )
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Adhara Socket.IO example'),
          backgroundColor: Colors.black,
          elevation: 0.0,
        ),
        body: Container(
          color: Colors.black,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Expanded(
                  child: Center(
                    child: ListView(
                      children: toPrint.map((String _) => Text(_ ?? "")).toList(),
                    ),
                  )),
              Row(
                mainAxisSize: MainAxisSize.max,
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Container(
                    margin: EdgeInsets.symmetric(horizontal: 8.0),
                    child: RaisedButton(
                      child: Text("Connect"),
                      onPressed: isProbablyConnected?null:initSocket,
                    ),
                  ),
                  Container(
                      margin: EdgeInsets.symmetric(horizontal: 8.0),
                      child: RaisedButton(
                        child: Text("Send Message"),
                        onPressed: isProbablyConnected?sendMessage:null,
                      )
                  ),
                  Container(
                      margin: EdgeInsets.symmetric(horizontal: 8.0),
                      child: RaisedButton(
                        child: Text("Disconnect"),
                        onPressed: isProbablyConnected?disconnect:null,
                      )
                  ),
                ],
              ),
              SizedBox(height: 12.0,)
            ],
          ),
        ),
      ),
    );
  }
}

最佳答案

你可以试试下面的库。我尝试订阅 channel 并收听事件,效果很好。

https://github.com/kakajansh/echo

关于sockets - 使用 Socket.io 构建 Flutter 应用程序 : can't listen to or emit msgs to the socket channel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54869349/

相关文章:

node.js - 尝试连接到本地 Express 服务器时出现 "Cannot GET/"

node.js - 使用 Socket.IO 和 NodeJS 实现音频聊天

.net - TCPListener blues,无法弄清楚为什么连接没有正确关闭

python - 你可以使用 python 套接字进行 docker 容器通信吗?

javascript - 如何将用户从一个房间切换到另一个房间?

dart - 扩展TemplateElement

dart - 随Dart 2安装的AngularDart

android - 使用 Flutter 从方法中获取一些变量值

javascript - 在线托管 node.js 项目

PHP 将 ssh2_shell() 与 socket_select() 结合使用