golang实时应用框架socket.io库插件go-socket.io的使用
golang实时应用框架socket.io库插件go-socket.io的使用
警告
此仓库已归档。请查看fork版本
go-socket.io介绍
go-socket.io是Golang中Socket.IO库的实现,它是一个实时应用框架。当前该库支持Socket.IO客户端1.4版本,目前支持房间、命名空间和广播功能。
安装
使用以下命令安装包:
go get github.com/googollee/go-socket.io
导入方式:
import "github.com/googollee/go-socket.io"
在代码中使用socketio
作为包名。
示例代码
下面是一个完整的go-socket.io使用示例:
package main
import (
"log"
"net/http"
socketio "github.com/googollee/go-socket.io"
)
func main() {
// 创建Socket.IO服务器
server, err := socketio.NewServer(nil)
if err != nil {
log.Fatal(err)
}
// 处理连接事件
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)
})
// 启动HTTP服务器
go server.Serve()
defer server.Close()
http.Handle("/socket.io/", server)
http.Handle("/", http.FileServer(http.Dir("./asset")))
log.Println("Serving at localhost:8000...")
log.Fatal(http.ListenAndServe(":8000", nil))
}
常见问题
关于此仓库的一些常见问题:
-
此库是否支持socket.io版本2?
- 不支持,但如果您愿意,可以帮助实现。加入我们的社区聊天Telegram
-
如何将go-socket.io与CORS一起使用?
- 请查看项目中的示例
社区
Telegram聊天: @go_socketio
Engineio
此项目包含一个名为engineio
的子包。它包含原始node包的engine.io
模拟实现。它可以不依赖socket.io实现单独使用。
许可证
3-clause BSD许可证
更多关于golang实时应用框架socket.io库插件go-socket.io的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang实时应用框架socket.io库插件go-socket.io的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go-Socket.IO 使用指南
Go-Socket.IO 是一个用于 Golang 的 Socket.IO 库实现,允许开发者构建实时应用程序。下面我将详细介绍如何使用这个库。
安装
首先安装 go-socket.io 库:
go get github.com/googollee/go-socket.io
基本服务器示例
package main
import (
"log"
"net/http"
socketio "github.com/googollee/go-socket.io"
)
func main() {
// 创建Socket.IO服务器
server := socketio.NewServer(nil)
// 处理连接事件
server.OnConnect("/", func(conn socketio.Conn) error {
log.Println("connected:", conn.ID())
conn.Join("room1") // 加入房间
return nil
})
// 处理自定义事件
server.OnEvent("/", "notice", func(conn socketio.Conn, msg string) {
log.Println("notice:", msg)
conn.Emit("reply", "have "+msg)
})
// 处理错误事件
server.OnError("/", func(conn socketio.Conn, err error) {
log.Println("error:", err)
})
// 处理断开连接事件
server.OnDisconnect("/", func(conn socketio.Conn, reason string) {
log.Println("closed:", reason)
})
// 设置HTTP路由
go server.Serve()
defer server.Close()
http.Handle("/socket.io/", server)
http.Handle("/", http.FileServer(http.Dir("./asset")))
log.Println("Serving at localhost:8000...")
log.Fatal(http.ListenAndServe(":8000", nil))
}
客户端连接示例
HTML客户端代码 (可以放在asset目录下):
<!DOCTYPE html>
<html>
<head>
<title>Socket.IO Client</title>
<script src="https://cdn.socket.io/4.5.0/socket.io.min.js"></script>
</head>
<body>
<script>
const socket = io('http://localhost:8000', {
path: '/socket.io/'
});
socket.on('connect', () => {
console.log('Connected to server');
socket.emit('notice', 'hello');
});
socket.on('reply', (data) => {
console.log('Received reply:', data);
});
socket.on('disconnect', () => {
console.log('Disconnected from server');
});
</script>
</body>
</html>
进阶功能
1. 房间管理
// 加入房间
server.OnEvent("/", "join", func(conn socketio.Conn, room string) {
conn.Join(room)
conn.Emit("joined", "You joined "+room)
})
// 向房间广播消息
server.OnEvent("/", "room message", func(conn socketio.Conn, room string, msg string) {
server.BroadcastToRoom("/", room, "room message", msg)
})
2. 命名空间
// 创建命名空间
nsp := server.Of("/admin")
nsp.OnConnect(func(conn socketio.Conn) error {
log.Println("Admin connected:", conn.ID())
return nil
})
nsp.OnEvent("admin message", func(conn socketio.Conn, msg string) {
log.Println("Admin message:", msg)
})
3. 中间件
// 添加连接中间件
server.OnConnect("/", func(conn socketio.Conn) error {
// 检查认证
token := conn.URL().Query().Get("token")
if token != "secret" {
return errors.New("authentication failed")
}
return nil
})
性能优化
- 使用适配器:对于分布式部署,可以使用Redis适配器
import "github.com/googollee/go-socket.io/redis"
// 创建Redis适配器
adapter, err := redis.NewAdapter("redis://localhost:6379")
if err != nil {
log.Fatal(err)
}
server.SetAdapter(adapter)
- 配置选项
server, err := socketio.NewServer(nil, socketio.WithPingInterval(1*time.Second),
socketio.WithPingTimeout(500*time.Millisecond),
socketio.WithMaxPayload(1e6)) // 1MB
if err != nil {
log.Fatal(err)
}
常见问题解决
- 跨域问题:可以在创建服务器时配置
server, err := socketio.NewServer(nil, socketio.WithCors(&cors.Options{
AllowedOrigins: []string{"http://localhost:3000"},
AllowCredentials: true,
}))
- 连接断开处理:确保正确处理断开连接
server.OnDisconnect("/", func(conn socketio.Conn, reason string) {
log.Println("Client disconnected:", conn.ID(), reason)
// 清理资源
})
Go-Socket.IO 提供了构建实时应用程序的强大功能,通过合理使用事件、房间和命名空间,可以构建复杂的实时交互系统。