1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- export default class WebSocketService {
- constructor(url) {
- this.socket = null;
- this.url = url;
- // 心跳定时器
- this.heartbeatTimer = null;
- this.heartbeatInterval = 30000; // 30秒
- // 重连次数
- this.reconnectAttempts = 50; // 默认重连次数
- this.maxReconnectAttempts = 100; // 最大重连次数
- this.reconnectInterval = 2000; // 2秒
- // 存储回调函数
- this.onMessageCallback = null; // 存储回调函数
- }
- // 重连
- reconnect() {
- if (this.reconnectAttempts < this.maxReconnectAttempts) {
- this.reconnectAttempts++;
- console.log(`尝试重新连接... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`);
- setTimeout(() => {
- this.connect();
- }, this.reconnectInterval);
- } else {
- console.error('达到最大重连次数,连接失败');
- }
- }
- // 开启心跳
- startHeartbeat() {
- this.heartbeatTimer = setInterval(() => {
- this.send({ type: 'heartbeat' });
- }, this.heartbeatInterval);
- }
- // 关闭心跳
- stopHeartbeat() {
- if (this.heartbeatTimer) {
- clearInterval(this.heartbeatTimer);
- this.heartbeatTimer = null;
- }
- }
- // 连接
- async connect() {
- this.socket = new WebSocket(this.url);
- this.socket.onopen = await this.onOpen.bind(this);
- this.socket.onmessage = this.onMessage.bind(this);
- this.socket.onclose = this.onClose.bind(this);
- this.socket.onerror = this.onError.bind(this);
- }
- // 连接成功
- onOpen() {
- console.log('WebSocket连接已建立');
- this.reconnectAttempts = 0;
- this.startHeartbeat();
- }
- //
- onMessage(event) {
- console.log('收到消息:', event.data);
- if (this.onMessageCallback) {
- this.onMessageCallback(event.data); // 调用回调函数
- }
- }
- // 接收到错误消息
- onClose() {
- console.log('WebSocket连接已关闭');
- this.stopHeartbeat();
- this.reconnect();
- }
- // 接收到错误消息
- onError(error) {
- console.error('WebSocket错误:', error);
- }
- // 发送消息
- send(data) {
- if (this.socket && this.socket.readyState === WebSocket.OPEN) {
- this.socket.send(JSON.stringify(data));
- } else {
- console.error('WebSocket未连接');
- }
- }
- // 关闭连接
- close() {
- if (this.socket) {
- this.socket.close();
- }
- }
- }
- // urls: [
- // 'turn:124.71.68.142:3478?transport=udp', // 强制UDP
- // 'turn:124.71.68.142:3478?transport=tcp' // TCP备用
- // ]
- // const ws = new WebSocketService(`ws://192.168.0.59:3001/ws?user_id=${userId}`)
|