【问题标题】:flutter websocket connection issue颤动的websocket连接问题
【发布时间】:2018-10-18 01:40:56
【问题描述】:

我正在尝试开发一个连接到服务器并使用 websocket 交换数据的颤振应用程序。服务器位于 .Net Core 中,并使用 Asp.Net Core Websockets 来实现此功能。

我面临的问题是,我的颤振应用程序无法连接到服务器并引发以下错误。

E/flutter (31498): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter (31498): WebSocketChannelException: WebSocketChannelException: WebSocketException: Connection to 'http://127.0.0.1/client#' was not upgraded to websocket
E/flutter (31498): #0      new IOWebSocketChannel._withoutSocket.<anonymous closure> (package:web_socket_channel/io.dart:83:24)
E/flutter (31498): #1      _invokeErrorHandler (dart:async/async_error.dart:13:29)
E/flutter (31498): #2      _HandleErrorStream._handleError (dart:async/stream_pipe.dart:286:9)
E/flutter (31498): #3      _ForwardingStreamSubscription._handleError (dart:async/stream_pipe.dart:168:13)
E/flutter (31498): #4      _RootZone.runBinaryGuarded (dart:async/zone.dart:1328:10)
E/flutter (31498): #5      _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:350:15)
E/flutter (31498): #6      _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:367:16)
E/flutter (31498): #7      _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:266:7)
E/flutter (31498): #8      _SyncStreamController._sendError (dart:async/stream_controller.dart:767:19)
E/flutter (31498): #9      _StreamController._addError (dart:async/stream_controller.dart:647:7)
E/flutter (31498): #10     _RootZone.runBinaryGuarded (dart:async/zone.dart:1328:10)
E/flutter (31498): #11     _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:350:15)
E/flutter (31498): #12     _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:367:16)
E/flutter (31498): #13     _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:266:7)
E/flutter (31498): #14     _SyncStreamController._sendError (dart:async/stream_controller.dart:767:19)
E/flutter (31498): #15     _StreamController._addError (dart:async/stream_controller.dart:647:7)
E/flutter (31498): #16     new Stream.fromFuture.<anonymous closure> (dart:async/stream.dart:110:18)
E/flutter (31498): #17     _RootZone.runBinary (dart:async/zone.dart:1386:54)
E/flutter (31498): #18     _FutureListener.handleError (dart:async/future_impl.dart:141:20)
E/flutter (31498): #19     Future._propagateToListeners.handleError (dart:async/future_impl.dart:649:47)
E/flutter (31498): #20     Future._propagateToListeners (dart:async/future_impl.dart:670:24)
E/flutter (31498): #21     Future._completeError (dart:async/future_impl.dart:489:5)
E/flutter (31498): #22     Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:537:7)
E/flutter (31498): #23     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (31498): #24     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

重要的是,该应用程序能够连接到其他 websocket 服务器。它还可以连接到我为在同一台机器上测试而开发的其他原型服务器。

.Net 核心服务器也非常实用,我可以轻松地将浏览器连接到服务器并与之通信。

只有当我尝试将 Flutter 应用程序连接到 .Net 核心 websocket 服务器时才会出现问题。

我正在使用默认模板应用程序进行测试。这是我的 MyHomePage 类的代码

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final channel = new IOWebSocketChannel.connect("ws://192.168.1.139/client");

这是 _MyHomePageState 实现

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

initState() {
        super.initState();
        widget.channel.stream.listen(this.onData, onError: onError, onDone: onDone);

    (() async {
      setState(() {

      });
    });
  }

  onDone(){
    debugPrint("Socket is closed");
  }

  onError(err){
    debugPrint(err.runtimeType.toString());
    WebSocketChannelException ex = err;
    debugPrint(ex.message);
  }

  onData(event){
    debugPrint(event);
  }

这总是会导致 onError 并带有以下输出

I/flutter ( 4608): WebSocketChannelException
I/flutter ( 4608): WebSocketChannelException: WebSocketException: Connection to 'http://18.217.117.92/client#' was not upgraded to websocket
I/flutter ( 4608): Socket is closed

我知道这与 dart websocket 包如何执行与服务器的握手有关,但无法确定问题所在。

谁能弄清楚这里到底出了什么问题?

【问题讨论】:

  • 如何连接到服务器?请添加相关代码。
  • 我已经更新了代码并添加了缺失的位。除了创建频道并开始收听它之外,没有太多。除此之外,其他都是flutter自动生成的样板代码。

标签: asp.net-core websocket dart flutter


【解决方案1】:

我希望这会对许多人有所帮助,尽管这个问题不再相关。问题在于 .Net 核心 websocket 实现。

通过一些研究和分析 Wireshark 日志后,我可以意识到 .Net 核心以某种方式期望 websocket 协议更新标头以特定格式(即实现区分大小写)对于 .Net 核心框架 2.1 来说是正确的。但是,该问题在下一个版本中立即得到解决。我切换到测试版,问题得到解决。我就此咨询了 Flutter 开发人员和 .Net 核心团队,他们都确认了这一点。

.Net core的当前版本(在回答这个问题时是3.0,没有这样的问题。

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多