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类型传给后端