go实现持久websocket推送及定时cron服务代码

代码语言:golang

所属分类:其他

代码描述:go实现持久websocket推送及定时服务代码,通过api进行通讯,支持cron定时服务。

代码标签: go 持久websocket 推送 定时 cron 服务 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

// main.go
package main

import (
	"context"
	"database/sql"
	"encoding/json"
	"errors"
	"log"
	"net/http"
	"os"
	"strings"
	"sync"
	"time"

	"github.com/gin-gonic/gin"
	"github.com/google/uuid"
	"github.com/gorilla/websocket"
	_ "github.com/mattn/go-sqlite3"
	"github.com/robfig/cron/v3"
)

// --- WebSocket ConnectionManager ---

var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		return true // Allow all connections
	},
}

type ConnectionManager struct {
	// RWMutex is better here since sending messages (read-lock) is more frequent than connecting/disconnecting (write-lock).
	mu               sync.RWMutex
	activeConnections map[string]*websocket.Conn
}

func NewConnectionManager() *ConnectionManager {
	return &ConnectionManager{
		activeConnections: make(map[string]*websocket.Conn),
	}
}

func (m *ConnectionManager) Connect(ws *websocket.Conn) string {
	m.mu.Lock()
	defer m.mu.Unlock()

	clientID := uuid.New().String()
	m.activeConnections[clientID] = ws
	log.Printf("New client connected: %s", clientID)
	return clientID
}

func (m *ConnectionManager) Reconnect(clientID string, ws *websocket.Conn) string {
	m.mu.Lock()
	defer m.mu.Unlock()

	// If a previous connection existed, it will be replaced.
	m.activeConnections[clientID] = ws
	log.Printf("Client reconnected: %s", clientID)
	return clientID
}

func (m *ConnectionManager) Disconnect(clientID string) {
	m.mu.Lock()
	defer m.mu.Unlock()

	if _, ok := m.activeConnections[clientID]; ok {
		delete(m.activeConnections, clientID)
		log.Printf("Client disconnected: %s", clientID)
	}
}

type PushMessage struct {
	Type string      `json:"type"`
	Data interface{} `json:"data"`
}

func (m *ConnectionManager) SendJSONToClients(data interface{}, cli.........完整代码请登录后点击上方下载按钮下载查看

网友评论0