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/v2和socket.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>
关键点说明:
- 使用
adaptor.HTTPHandler将Socket.IO的HTTP处理器适配到Fiber - Socket.IO服务器需要处理WebSocket升级和轮询传输
- 确保客户端能够访问Socket.IO的JavaScript文件
- 注意CORS配置(如果需要跨域)
这种集成方式允许在Fiber应用中同时处理HTTP请求和WebSocket连接,适用于需要实时通信的应用场景。

