我正在尝试开发一个 flutter 应用程序,它连接到服务器并使用 websocket 交换数据。服务器位于.Net Core中,并使用Asp.Net Core Websockets来实现此功能。
我面临的问题是,我的 flutter 应用程序无法连接到服务器并引发以下错误。
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 服务器。它还可以连接到我开发的其他原型(prototype)服务器,以便在同一台机器上进行测试。
.Net core 服务器也非常实用,我可以轻松地将浏览器连接到服务器并与其通信。
仅当我尝试将 flutter 应用程序连接到 .Net core 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 包如何与服务器执行握手有关,但无法查明问题。
任何人都可以弄清楚这里到底出了什么问题吗?
最佳答案
我希望这会对很多人有所帮助,尽管这个问题不再相关。问题出在 .Net core websocket 实现上。
通过一些研究并分析 Wireshark 日志后,我可以意识到 .Net core 期望以特定格式的 websocket 协议(protocol)更新 header (即实现区分大小写),这对于 .Net core Framework 2.1 来说是正确的。不过,这个问题在下一个版本中立即得到了解决。我切换到测试版,问题得到解决。我就此咨询了 Flutter 开发人员以及 .Net core 团队,他们也证实了这一点。
.Net core的当前版本(在回答这个问题时是3.0,没有这样的问题。
关于asp.net-core - flutter websocket连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50227931/