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.

任何测试、贡献,甚至只是提供反馈,我们都将不胜感激。期待看到社区的反馈!

谢谢!


3 回复

看起来很有意思。你能提供一些与 gorilla/websocket 以及标准实现的比较吗?

这个模块有什么不同之处?在什么原因或情况下,会选择其中一个而不是另一个?


谢谢!

GoSocket 实际上是构建在 gorilla 之上的。 GoSocket 试图解决的问题是处理房间、客户端、编码、广播、事件——GoSocket 为你抽象了这些。 因此,你可以使用,例如,gosocket.OnConnect(…) 在客户端连接时执行逻辑,或者使用 gosocket.OnMessage(…) 在收到消息时处理。

这也可以用作一个处理器,所以如果你想在一个已经运行的 gorilla/gin/等服务器中实现,完全可以! 使用 gosocket.NewHandler(…) 将为你提供抽象,同时你将能够执行 http.Handle("/ws", ws)(其中 wsNewHandler() 的一个实例)。

如果你感兴趣,项目的 README (GitHub - FilipeJohansson/gosocket: 一个简单的 Go WebSocket 抽象,让你在几分钟内启动并运行。) 有更多示例。

我正在接收一些反馈,并且非常希望得到更多反馈 slight_smile

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编码器的实现,这对性能敏感的应用会很有帮助。

回到顶部