lxzan / gws

simple, fast, reliable websocket server & client, supports running over tcp/kcp/unix domain socket. keywords: ws, proxy, chat, go, golang...
https://pkg.go.dev/github.com/lxzan/gws
Apache License 2.0
1.34k stars 84 forks source link

这位大师,可以麻烦您把这个项目结合下fasthttp吗? #66

Closed ericjing83 closed 8 months ago

ericjing83 commented 9 months ago

您好, 如果有一个库,把当前项目的多个用户连接在一个协程里多路复用的特性,和fasthttp/websocket结合下。就更好了。这位大师可以试试吗?

lxzan commented 9 months ago

参考这个例子

package main

import (
    "bufio"
    fiber "github.com/gofiber/fiber/v2"
    "github.com/lxzan/gws"
    "log"
    "net"
    "net/http"
    "net/url"
)

func main() {
    upgrader := gws.NewUpgrader(&Handler{}, nil)

    app := fiber.New(fiber.Config{})

    app.Get("/connect", func(c *fiber.Ctx) error {
        r, err := getRequest(c)
        if err != nil {
            return err
        }
        c.Context().HijackSetNoResponse(true)
        c.Context().Hijack(func(conn net.Conn) {
            w := &responseWriter{
                conn: conn,
            }
            socket, err := upgrader.Upgrade(w, r)
            if err != nil {
                log.Printf(err.Error())
                return
            }
            socket.ReadLoop()
        })
        return nil
    })

    app.Listen(":3003")
}

func getRequest(c *fiber.Ctx) (*http.Request, error) {
    URL, err := url.Parse(string(c.Request().URI().FullURI()))
    if err != nil {
        return nil, err
    }

    var r = &http.Request{
        Method: c.Method(),
        Header: http.Header{},
        URL:    URL,
    }
    c.Request().Header.VisitAll(func(key, value []byte) {
        r.Header.Set(string(key), string(value))
    })
    return r, nil
}

type responseWriter struct {
    conn net.Conn
}

func (r *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
    return r.conn, nil, nil
}

func (r *responseWriter) Header() http.Header { return http.Header{} }

func (r *responseWriter) Write(bytes []byte) (int, error) { return 0, nil }

func (r *responseWriter) WriteHeader(statusCode int) { return }

type Handler struct {
    gws.BuiltinEventHandler
}

func (c *Handler) OnMessage(socket *gws.Conn, message *gws.Message) {
    defer message.Close()
    socket.WriteMessage(message.Opcode, message.Bytes())
}
ericjing83 commented 9 months ago

非常感谢。我用下试试。