Flutter websocket断开连接监听

10
在Flutter中,我想监听websocket断开事件,该如何实现?当应用程序进入后台时,websocket连接将会断开,我仍然没有找到让它在后台持续运行的方法(有人有解决方案吗?),因此我必须检测是否丢失了websocket连接,以便在失去连接时重新连接。如果有人知道如何实现,请帮忙。
5个回答

22
您可以通过实现 onDone 回调来判断 WebSocket 是否关闭。请参考以下示例:
      _channel = IOWebSocketChannel.connect(
        'ws://yourserver.com:port',
      );

      ///
      /// Start listening to new notifications / messages
      ///
      _channel.stream.listen(
        (dynamic message) {
          debugPrint('message $message');
        },
        onDone: () {
          debugPrint('ws channel closed');
        },
        onError: (error) {
          debugPrint('ws error $error');
        },
      );

希望这可以帮助你。


1
很抱歉,如果我没有理解错的话。但是你是如何重新连接的,在onDone()方法中你只是打印输出。 - Aloysius Samuel
实际上,它会自动重新连接。上述代码的重点是让您根据事件采取某些操作。 - Angel Todorov
1
@AngelTodorov 对我来说它不会自动重新连接。你能展示一些自动重新连接的代码吗? - dante

2
如果您的服务器关闭连接,只需使用pinginterval,例如:
ws.pingInterval = const Duration(seconds: 5);

应该调用onDone。

基本的乒乓足以。


1

2
你好,感谢你的帮助。那么你知道如何在Flutter上检测WebSocket是否正在运行吗? - Nicholas Jela

0
   WebSocketChannel channel = WebSocketChannel.connect(uri );
    Stream stream = channel.stream;
    stream.listen((event) {
      print('Event from Stream: $event');
      
    },onError: (e){
      
      Future.delayed(Duration(seconds: 10)).then((value) {
        connectAndListen();
      },);
      
    },
    onDone: (() {
    
      Future.delayed(Duration(seconds: 10)).then((value) {
        connectAndListen();
      },);
    })
    );

0

我建议您使用这个跨平台的WebSocket包https://pub.dev/packages/websocket_universal,在那里您甚至可以跟踪所有发生的WS事件(如果需要,还有内置的ping测量):

import 'package:websocket_universal/websocket_universal.dart';

/// Example works with Postman Echo server
void main() async {
  /// Postman echo ws server (you can use your own server URI)
  /// 'wss://ws.postman-echo.com/raw'
  /// For local server it could look like 'ws://127.0.0.1:42627/websocket'
  const websocketConnectionUri = 'wss://ws.postman-echo.com/raw';
  const textMessageToServer = 'Hello server!';
  const connectionOptions = SocketConnectionOptions(
    pingIntervalMs: 3000, // send Ping message every 3000 ms
    timeoutConnectionMs: 4000, // connection fail timeout after 4000 ms
    /// see ping/pong messages in [logEventStream] stream
    skipPingMessages: false,

    /// Set this attribute to `true` if do not need any ping/pong
    /// messages and ping measurement. Default is `false`
    pingRestrictionForce: false,
  );

  /// Example with simple text messages exchanges with server
  /// (not recommended for applications)
  /// [<String, String>] generic types mean that we receive [String] messages
  /// after deserialization and send [String] messages to server.
  final IMessageProcessor<String, String> textSocketProcessor =
      SocketSimpleTextProcessor();
  final textSocketHandler = IWebSocketHandler<String, String>.createClient(
    websocketConnectionUri, // Postman echo ws server
    textSocketProcessor,
    connectionOptions: connectionOptions,
  );

  // Listening to webSocket status changes
  textSocketHandler.socketHandlerStateStream.listen((stateEvent) {
    // ignore: avoid_print
    print('> status changed to ${stateEvent.status}');
  });

  // Listening to server responses:
  textSocketHandler.incomingMessagesStream.listen((inMsg) {
    // ignore: avoid_print
    print('> webSocket  got text message from server: "$inMsg" '
        '[ping: ${textSocketHandler.pingDelayMs}]');
  });

  // Listening to debug events inside webSocket
  textSocketHandler.logEventStream.listen((debugEvent) {
    // ignore: avoid_print
    print('> debug event: ${debugEvent.socketLogEventType}'
        ' [ping=${debugEvent.pingMs} ms]. Debug message=${debugEvent.message}');
  });

  // Listening to outgoing messages:
  textSocketHandler.outgoingMessagesStream.listen((inMsg) {
    // ignore: avoid_print
    print('> webSocket sent text message to   server: "$inMsg" '
        '[ping: ${textSocketHandler.pingDelayMs}]');
  });

  // Connecting to server:
  final isTextSocketConnected = await textSocketHandler.connect();
  if (!isTextSocketConnected) {
    // ignore: avoid_print
    print('Connection to [$websocketConnectionUri] failed for some reason!');
    return;
  }

  textSocketHandler.sendMessage(textMessageToServer);

  await Future<void>.delayed(const Duration(seconds: 30));
  // Disconnecting from server:
  await textSocketHandler.disconnect('manual disconnect');
  // Disposing webSocket:
  textSocketHandler.close();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接