Go语言WebSocket框架GoSocket的入门介绍
Go语言WebSocket框架GoSocket的入门介绍 大家好,Go 社区的朋友们,
我很高兴向大家介绍 GoSocket,这是一个为 Go 语言设计的轻量级 WebSocket 库,旨在让 WebSocket 服务器的搭建变得快速而简单。
在 Go 中设置 WebSocket 服务器通常需要编写大量样板代码:处理连接、管理客户端、广播消息、处理房间以及支持不同的消息格式。GoSocket 将这些全部抽象化,让你只需几行代码就能运行一个可工作的服务器。
功能特性
- 快速设置: 5-10 行代码即可启动服务器
- 支持多种编码: JSON(已实现)、Protobuf 和 MessagePack(计划中)或原始二进制数据
- 房间与广播: 轻松加入/离开房间并广播消息
- 中间件支持: 身份验证、日志记录、CORS 等
- 优雅关闭: 干净的连接处理
- 多服务器支持: 可同时在多个端口上运行聊天、通知和管理面板等服务器
快速示例
ws := gosocket.NewServer()
ws.WithPort(8080).
WithPath("/ws").
OnConnect(func(client *gosocket.Client, ctx *gosocket.HandlerContext) error {
fmt.Printf("Client connected: %s\n", client.ID)
return nil
}).
OnMessage(func(client *gosocket.Client, message *gosocket.Message, ctx *gosocket.HandlerContext) error {
fmt.Printf("Received: %s\n", string(message.RawData))
// Echo back
client.Send(message.RawData)
return nil
}).
OnDisconnect(func(client *gosocket.Client, ctx *gosocket.HandlerContext) error {
fmt.Printf("Client disconnected: %s\n", client.ID)
return nil
})
log.Fatal(ws.Start())
更多示例,请查看 examples 文件夹。
当前状态
我们计划很快发布 v1.0.0 版本,但你现在就可以开始测试预发布版本。
参与贡献
GoSocket 正在积极开发中,我们欢迎在以下方面做出贡献:
- 文档和示例
- 测试边界情况和性能场景
- 添加新的序列化器(如 Protobuf、MessagePack)
如果你想参与贡献,请查看代码结构,开一个 issue 来讨论你想做的工作,然后就可以开始编码了。
你可以在 GitHub 上找到这个项目:GitHub - FilipeJohansson/gosocket: A simple WebSocket abstraction for Go that gets you up and running in minutes.
任何测试、贡献,甚至只是提供反馈,我们都将不胜感激。期待看到社区的反馈!
谢谢!
看起来很有意思。你能提供一些与 gorilla/websocket 以及标准实现的比较吗?
这个模块有什么不同之处?在什么原因或情况下,会选择其中一个而不是另一个?
谢谢!
GoSocket 实际上是构建在 gorilla 之上的。
GoSocket 试图解决的问题是处理房间、客户端、编码、广播、事件——GoSocket 为你抽象了这些。
因此,你可以使用,例如,gosocket.OnConnect(…) 在客户端连接时执行逻辑,或者使用 gosocket.OnMessage(…) 在收到消息时处理。
这也可以用作一个处理器,所以如果你想在一个已经运行的 gorilla/gin/等服务器中实现,完全可以!
使用 gosocket.NewHandler(…) 将为你提供抽象,同时你将能够执行 http.Handle("/ws", ws)(其中 ws 是 NewHandler() 的一个实例)。
如果你感兴趣,项目的 README (GitHub - FilipeJohansson/gosocket: 一个简单的 Go WebSocket 抽象,让你在几分钟内启动并运行。) 有更多示例。
我正在接收一些反馈,并且非常希望得到更多反馈 
GoSocket看起来是一个很有潜力的WebSocket框架,设计简洁且功能实用。从代码示例来看,API设计得很直观,特别是链式调用让配置变得很清晰。
这里是一个使用房间功能的示例:
ws := gosocket.NewServer()
ws.WithPort(8080).
WithPath("/ws").
OnConnect(func(client *gosocket.Client, ctx *gosocket.HandlerContext) error {
// 新连接自动加入大厅房间
client.Join("lobby")
client.Send([]byte("Welcome to the lobby!"))
return nil
}).
OnMessage(func(client *gosocket.Client, message *gosocket.Message, ctx *gosocket.HandlerContext) error {
// 解析JSON消息
var msg struct {
Type string `json:"type"`
Content string `json:"content"`
Room string `json:"room,omitempty"`
}
if err := json.Unmarshal(message.RawData, &msg); err != nil {
return err
}
switch msg.Type {
case "join":
client.Join(msg.Room)
client.Send([]byte(fmt.Sprintf("Joined room: %s", msg.Room)))
case "leave":
client.Leave(msg.Room)
client.Send([]byte(fmt.Sprintf("Left room: %s", msg.Room)))
case "broadcast":
// 广播消息到指定房间
ws.BroadcastToRoom(msg.Room, []byte(msg.Content))
}
return nil
})
log.Fatal(ws.Start())
中间件的使用示例:
// 认证中间件
func authMiddleware(next gosocket.HandlerFunc) gosocket.HandlerFunc {
return func(client *gosocket.Client, ctx *gosocket.HandlerContext) error {
token := ctx.Request.URL.Query().Get("token")
if token != "valid-token" {
return fmt.Errorf("unauthorized")
}
return next(client, ctx)
}
}
// 日志中间件
func loggingMiddleware(next gosocket.HandlerFunc) gosocket.HandlerFunc {
return func(client *gosocket.Client, ctx *gosocket.HandlerContext) error {
start := time.Now()
err := next(client, ctx)
log.Printf("Request from %s took %v", client.ID, time.Since(start))
return err
}
}
ws := gosocket.NewServer()
ws.Use(loggingMiddleware)
ws.Use(authMiddleware)
JSON编码器的使用:
type ChatMessage struct {
Username string `json:"username"`
Message string `json:"message"`
Timestamp int64 `json:"timestamp"`
}
ws := gosocket.NewServer().
WithEncoder(gosocket.JSONEncoder{}).
OnMessage(func(client *gosocket.Client, message *gosocket.Message, ctx *gosocket.HandlerContext) error {
var msg ChatMessage
if err := message.Decode(&msg); err != nil {
return err
}
msg.Timestamp = time.Now().Unix()
// 广播给所有连接的客户端
ws.Broadcast(msg)
return nil
})
框架的API设计让常见WebSocket用例的实现变得很直接,特别是房间管理和广播功能。期待看到Protobuf和MessagePack编码器的实现,这对性能敏感的应用会很有帮助。

