当前位置:   article > 正文

flutter webscoket连接,聊天_dart web_socket_channel

dart web_socket_channel
  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'package:web_socket_channel/web_socket_channel.dart';
  4. import '../pages/play/live_id.dart';
  5. class WebSocketManager {
  6. static final WebSocketManager _instance = WebSocketManager._internal();
  7. WebSocketManager._internal();
  8. static WebSocketManager getInstance() {
  9. return _instance;
  10. }
  11. WebSocketChannel? _channel;
  12. bool _isConnected = false;
  13. int _heartbeatInterval = 30000;
  14. Timer? _heartbeatTimer;
  15. Future<void> connect() async {
  16. print('_channel${_channel}');
  17. if (_channel != null) {
  18. return; // 连接已建立,直接返回
  19. }
  20. final url= 'ws://你自己的url';
  21. try {
  22. _channel = await WebSocketChannel.connect(Uri.parse(url));
  23. print('_channel_channel_channel_channel${_channel}');
  24. _channel?.stream.listen((data) {
  25. _onMessage(data);
  26. }, onError: (error) {
  27. _onConnectionFailed(error);
  28. }, onDone: () {
  29. _onConnectionClosed();
  30. });
  31. _startHeartbeat();
  32. _isConnected = true;
  33. _onConnectionSuccess();
  34. } catch (e) {
  35. _onConnectionFailed(e);
  36. }
  37. }
  38. void sendJoinGroupChat(String groupId) {
  39. if (_isConnected) {
  40. Map<String, dynamic> joinMessage = {
  41. "type": "joinGroupChat",
  42. "groupId": groupId,
  43. };
  44. var json = jsonEncode(joinMessage);
  45. _channel?.sink.add(json);
  46. }
  47. }
  48. void exitGroupChat(String groupId) {
  49. if (_isConnected) {
  50. Map<String, dynamic> joinMessage = {
  51. "type": "exitGroupChat",
  52. "groupId": groupId,
  53. };
  54. var json = jsonEncode(joinMessage);
  55. _channel?.sink.add(json);
  56. }
  57. }
  58. void sendGroupMessage(String groupId, String contentText) {
  59. print('_isConnected${_isConnected}');
  60. if (_isConnected) {
  61. Map<String, dynamic> message = {
  62. "type": "sendGroupMsg",
  63. "groupId": groupId,
  64. "contentText": contentText,
  65. };
  66. var json = jsonEncode(message);
  67. _channel?.sink.add(json);
  68. }
  69. }
  70. void disconnect() {
  71. _channel?.sink.close();
  72. _heartbeatTimer?.cancel();
  73. _isConnected = false;
  74. }
  75. void _onConnectionSuccess() {
  76. homeG.webscoket = true;
  77. print("连接成功");
  78. }
  79. void _onMessage(dynamic data) {
  80. if (_isConnected) {
  81. Map<String, dynamic> remessage = {
  82. "type": "receiveGroupMsg",
  83. };
  84. // _channel?.sink.add(remessage.toString());
  85. var json = jsonEncode(remessage);
  86. _channel?.sink.add(json);
  87. }
  88. print("收到消息:$data");
  89. // 在这里处理接收到的消息
  90. }
  91. void _onConnectionFailed(dynamic error) {
  92. print("连接失败:$error");
  93. // 重连
  94. Future.delayed(Duration(seconds: 3), () {
  95. // connect(_channel?.url?.origin ?? "", "staffid");
  96. connect();
  97. });
  98. }
  99. void _onConnectionClosed() {
  100. homeG.webscoket = false;
  101. print("连接关闭");
  102. }
  103. void _startHeartbeat() {
  104. _heartbeatTimer =
  105. Timer.periodic(Duration(milliseconds: _heartbeatInterval), (timer) {
  106. sendHeartbeat();
  107. });
  108. }
  109. void sendHeartbeat() {
  110. if (_isConnected) {
  111. Map<String, dynamic> heartbeatMessage = {
  112. "type": "heart",
  113. };
  114. // _channel?.sink.add(heartbeatMessage.toString());
  115. var json = jsonEncode(heartbeatMessage);
  116. _channel?.sink.add(json);
  117. }
  118. }
  119. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/268659
推荐阅读
相关标签
  

闽ICP备14008679号