如何将 flutter Web_socket_channel 包与 Django Channels 连接?

时间:2021-01-12 09:04:43

标签: django flutter-dependencies django-channels

我想将 Flutterweb_socket_channel 包与 Django 频道 连接起来。 我的应用程序使用 Django 模板和 Redis 服务器完美通信。 我想使用颤振包,以便我可以将它与颤振应用程序一起使用。

Django 频道 Django API 使用以下路线:

 application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(

        URLRouter([
            path('ws/chat/<str:room_name>/', consumers.ChatConsumer)
        ])
    ),
 })

JS WebSocket: 我的 Django 模板使用以下 url 路径连接 websocket:

 const chatSocket = new WebSocket(
            'ws://'
            + window.location.host
            + '/ws/chat/'
            + roomName
            + '/'
        );

颤动: 我已经尝试使用以下代码使用 flutter 连接到 Django 频道,但失败了。

  void startSocket() async {
    final channel = IOWebSocketChannel.connect('ws://$baseUrl/ws/chat/hello/');
    channel.stream.listen(
      (event) {
        channel.sink.add('Received!');
        channel.sink.close(status.goingAway);
      },
    );
  }

我看过其他人对同一主题的查询,并将以下权限添加到 AndroidMenifest.xml

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET"/>

但仍显示以下错误:

    E/flutter ( 4901): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: WebSocketChannelException: WebSocketChannelException: SocketException: Failed host lookup: 'http' (OS Error: No address associated with hostname, errno = 7)
    E/flutter ( 4901): #0      new IOWebSocketChannel._withoutSocket.<anonymous closure>
    package:web_socket_channel/io.dart:84
    E/flutter ( 4901): #1      _invokeErrorHandler (dart:async/async_error.dart:16:24)
    E/flutter ( 4901): #2      _HandleErrorStream._handleError (dart:async/stream_pipe.dart:282:9)
    E/flutter ( 4901): #3      _ForwardingStreamSubscription._handleError (dart:async/stream_pipe.dart:161:13)
    E/flutter ( 4901): #4      _rootRunBinary (dart:async/zone.dart:1214:47)
    E/flutter ( 4901): #5      _CustomZone.runBinary (dart:async/zone.dart:1107:19)
    E/flutter ( 4901): #6      _CustomZone.runBinaryGuarded (dart:async/zone.dart:1013:7)
    E/flutter ( 4901): #7      _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:376:15)
    E/flutter ( 4901): #8      _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:394:16)
    E/flutter ( 4901): #9      _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:294:7)
    E/flutter ( 4901): #10     _SyncStreamControllerDispatch._sendError (dart:async/stream_controller.dart:812:19)
    E/flutter ( 4901): #11     _StreamController._addError (dart:async/stream_controller.dart:690:7)
    E/flutter ( 4901): #12     _rootRunBinary (dart:async/zone.dart:1214:47)
    E/flutter ( 4901): #13     _CustomZone.runBinary (dart:async/zone.dart:1107:19)
    E/flutter ( 4901): #14     _CustomZone.runBinaryGuarded (dart:async/zone.dart:1013:7)
    E/flutter ( 4901): #15     _BufferingStreamSubscription._sendError.sendError (dart:async/stream_impl.dart:376:15)
    E/flutter ( 4901): #16     _BufferingStreamSubscription._sendError (dart:async/stream_impl.dart:394:16)
    E/flutter ( 4901): #17     _BufferingStreamSubscription._addError (dart:async/stream_impl.dart:294:7)
    

    E/flutter ( 4901): #18     _SyncStreamControllerDispatch._sendError (dart:async/stream_controller.dart:812:19)
    E/flutter ( 4901): #19     _StreamController._addError (dart:async/stream_controller.dart:690:7)
    E/flutter ( 4901): #20     new Stream.fromFuture.<anonymous closure> (dart:async/stream.dart:178:18)
    E/flutter ( 4901): #21     _rootRunBinary (dart:async/zone.dart:1214:47)
    E/flutter ( 4901): #22     _CustomZone.runBinary (dart:async/zone.dart:1107:19)
    E/flutter ( 4901): #23     _FutureListener.handleError (dart:async/future_impl.dart:157:20)
    E/flutter ( 4901): #24     Future._propagateToListeners.handleError (dart:async/future_impl.dart:708:47)
    E/flutter ( 4901): #25     Future._propagateToListeners (dart:async/future_impl.dart:729:24)
    E/flutter ( 4901): #26     Future._completeError (dart:async/future_impl.dart:537:5)
    E/flutter ( 4901): #27     Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:593:7)
    E/flutter ( 4901): #28     _rootRun (dart:async/zone.dart:1190:13)
    E/flutter ( 4901): #29     _CustomZone.run (dart:async/zone.dart:1093:19)
    E/flutter ( 4901): #30     _CustomZone.runGuarded (dart:async/zone.dart:997:7)
    E/flutter ( 4901): #31     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1037:23)
    E/flutter ( 4901): #32     _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
    E/flutter ( 4901): #33     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
    E/flutter ( 4901):
    D/EGL_emulation( 4901): eglMakeCurrent: 0xe87859c0: ver 2 0 (tinfo 0xe8783df0)
    E/BufferQueueProducer( 4901): [SurfaceTexture-0-4901-3] cancelBuffer: BufferQueue has been abandoned

请求甚至没有到达后端 api get 方式。

1 个答案:

答案 0 :(得分:0)

你不需要JS代码和html模板。 如果你使用本地主机来运行你的服务器,你应该像这样改变你的颤振代码:

final channel = IOWebSocketChannel.connect('ws://127.0.0.1:8000/ws/chat/hello/');

不要忘记在 django 项目的 settings.py 中更改 ALLOWED_HOSTS。你可以像这样改变它:

ALLOWED_HOSTS = ['*']

如果 127.0.0.1 不起作用,请使用 10.0.2.2 代替