flutter webscoket连接,聊天

import 'dart:async';
import 'dart:convert';
import 'package:web_socket_channel/web_socket_channel.dart';
import '../pages/play/live_id.dart';
class WebSocketManager {
  static final WebSocketManager _instance = WebSocketManager._internal();

  WebSocketManager._internal();

  static WebSocketManager getInstance() {
    return _instance;
  }

  WebSocketChannel? _channel;
  bool _isConnected = false;
  int _heartbeatInterval = 30000;
  Timer? _heartbeatTimer;
  Future<void> connect() async {
    print('_channel${_channel}');
    if (_channel != null) {
      return; // 连接已建立,直接返回
    }

    final url= 'ws://你自己的url';

    try {
      _channel = await WebSocketChannel.connect(Uri.parse(url));
      print('_channel_channel_channel_channel${_channel}');
      _channel?.stream.listen((data) {
        _onMessage(data);
      }, onError: (error) {
        _onConnectionFailed(error);
      }, onDone: () {
        _onConnectionClosed();
      });

      _startHeartbeat();

      _isConnected = true;
      _onConnectionSuccess();
    } catch (e) {
      _onConnectionFailed(e);
    }
  }

  void sendJoinGroupChat(String groupId) {
    if (_isConnected) {
      Map<String, dynamic> joinMessage = {
        "type": "joinGroupChat",
        "groupId": groupId,
      };
      var json = jsonEncode(joinMessage);
      _channel?.sink.add(json);
    }
  }

  void exitGroupChat(String groupId) {
    if (_isConnected) {
      Map<String, dynamic> joinMessage = {
        "type": "exitGroupChat",
        "groupId": groupId,
      };
      var json = jsonEncode(joinMessage);
      _channel?.sink.add(json);
    }
  }

  void sendGroupMessage(String groupId, String contentText) {
    print('_isConnected${_isConnected}');

    if (_isConnected) {
      Map<String, dynamic> message = {
        "type": "sendGroupMsg",
        "groupId": groupId,
        "contentText": contentText,
      };
      var json = jsonEncode(message);
      _channel?.sink.add(json);
    }
  }

  void disconnect() {
    _channel?.sink.close();
    _heartbeatTimer?.cancel();
    _isConnected = false;
  }

  void _onConnectionSuccess() {
    homeG.webscoket = true;
    print("连接成功");
  }

  void _onMessage(dynamic data) {
    if (_isConnected) {
      Map<String, dynamic> remessage = {
        "type": "receiveGroupMsg",
      };
      // _channel?.sink.add(remessage.toString());
      var json = jsonEncode(remessage);
      _channel?.sink.add(json);
    }
    print("收到消息:$data");
    // 在这里处理接收到的消息
  }

  void _onConnectionFailed(dynamic error) {
    print("连接失败:$error");
    // 重连
    Future.delayed(Duration(seconds: 3), () {
      // connect(_channel?.url?.origin ?? "", "staffid");
      connect();
    });
  }

  void _onConnectionClosed() {
    homeG.webscoket = false;
    print("连接关闭");
  }

  void _startHeartbeat() {
    _heartbeatTimer =
        Timer.periodic(Duration(milliseconds: _heartbeatInterval), (timer) {
      sendHeartbeat();
    });
  }

  void sendHeartbeat() {
    if (_isConnected) {
      Map<String, dynamic> heartbeatMessage = {
        "type": "heart",
      };
      // _channel?.sink.add(heartbeatMessage.toString());
      var json = jsonEncode(heartbeatMessage);
      _channel?.sink.add(json);
    }
  }
}

需要用jsonEncode编码一下成json类型传给后端

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值