Golang中如何将Socket.io与Fiber框架集成

Golang中如何将Socket.io与Fiber框架集成 我想将 Socket.IO 与 Fiber 集成,以便在代码中用于建立连接。

2 回复

你好,

我没有使用 Fiber 的经验,但有一个社区维护的包你可能可以使用:GitHub - googollee/go-socket.io: socket.io library for golang, a realtime application framework.

更多关于Golang中如何将Socket.io与Fiber框架集成的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Fiber中集成Socket.IO可以通过github.com/gofiber/websocket/v2socket.io库实现。以下是具体实现示例:

首先安装必要的依赖:

go get github.com/gofiber/fiber/v2
go get github.com/gofiber/websocket/v2
go get github.com/googollee/go-socket.io

基础集成示例:

package main

import (
    "log"
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/websocket/v2"
    socketio "github.com/googollee/go-socket.io"
)

func main() {
    app := fiber.New()
    
    // 创建Socket.IO服务器
    server, err := socketio.NewServer(nil)
    if err != nil {
        log.Fatal(err)
    }
    
    // Socket.IO事件处理
    server.OnConnect("/", func(s socketio.Conn) error {
        log.Println("connected:", s.ID())
        return nil
    })
    
    server.OnEvent("/", "notice", func(s socketio.Conn, msg string) {
        log.Println("notice:", msg)
        s.Emit("reply", "have "+msg)
    })
    
    server.OnError("/", func(s socketio.Conn, e error) {
        log.Println("meet error:", e)
    })
    
    server.OnDisconnect("/", func(s socketio.Conn, reason string) {
        log.Println("closed", reason)
    })
    
    // 将Socket.IO处理器转换为http.Handler
    socketHandler := server
    
    // Fiber路由设置
    app.Use("/socket.io/", func(c *fiber.Ctx) error {
        if websocket.IsWebSocketUpgrade(c) {
            c.Locals("allowed", true)
            return c.Next()
        }
        return fiber.ErrUpgradeRequired
    })
    
    // WebSocket端点
    app.Get("/socket.io/*", websocket.New(func(c *websocket.Conn) {
        // 这里需要将WebSocket连接转换为Socket.IO连接
        // 注意:go-socket.io需要特殊的适配器来处理Fiber的WebSocket
        log.Println("WebSocket connection established")
        
        for {
            mt, msg, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                break
            }
            log.Printf("recv: %s", msg)
            
            err = c.WriteMessage(mt, msg)
            if err != nil {
                log.Println("write:", err)
                break
            }
        }
    }))
    
    // 提供Socket.IO客户端文件
    app.Static("/", "./public")
    
    // 启动服务器
    log.Fatal(app.Listen(":3000"))
}

更完整的集成方案(使用适配器):

package main

import (
    "log"
    "net/http"
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/adaptor"
    socketio "github.com/googollee/go-socket.io"
)

func main() {
    app := fiber.New()
    
    // 创建Socket.IO服务器
    server := socketio.NewServer(nil)
    
    server.OnConnect("/", func(s socketio.Conn) error {
        s.SetContext("")
        log.Println("connected:", s.ID())
        return nil
    })
    
    server.OnEvent("/", "chat message", func(s socketio.Conn, msg string) {
        log.Println("message:", msg)
        server.BroadcastToRoom("/", "room", "chat message", msg)
    })
    
    server.OnEvent("/", "join", func(s socketio.Conn, room string) string {
        s.Join(room)
        return "joined " + room
    })
    
    // 将Socket.IO处理器适配到Fiber
    app.All("/socket.io/*", adaptor.HTTPHandler(server))
    
    // 静态文件服务
    app.Static("/", "./public")
    
    // 启动服务器
    log.Fatal(app.Listen(":3000"))
}

客户端HTML示例(public/index.html):

<!DOCTYPE html>
<html>
<head>
    <title>Socket.IO with Fiber</title>
    <script src="/socket.io/socket.io.js"></script>
</head>
<body>
    <script>
        const socket = io('http://localhost:3000');
        
        socket.on('connect', () => {
            console.log('Connected to server');
        });
        
        socket.on('chat message', (msg) => {
            console.log('Message received:', msg);
        });
        
        // 发送消息示例
        socket.emit('chat message', 'Hello from client');
    </script>
</body>
</html>

关键点说明:

  1. 使用adaptor.HTTPHandler将Socket.IO的HTTP处理器适配到Fiber
  2. Socket.IO服务器需要处理WebSocket升级和轮询传输
  3. 确保客户端能够访问Socket.IO的JavaScript文件
  4. 注意CORS配置(如果需要跨域)

这种集成方式允许在Fiber应用中同时处理HTTP请求和WebSocket连接,适用于需要实时通信的应用场景。

回到顶部