Closed ericjing83 closed 8 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())
}
非常感谢。我用下试试。
您好, 如果有一个库,把当前项目的多个用户连接在一个协程里多路复用的特性,和fasthttp/websocket结合下。就更好了。这位大师可以试试吗?