gpt4 book ai didi

golang : serving net. Conn 使用 gin 路由器

转载 作者:行者123 更新时间:2023-12-05 03:28:53 35 4
gpt4 key购买 nike

我有一个处理传入 TCP 连接的函数:

func Handle(conn net.Conn) error {
// ...
}

另外,我有一个带有实现句柄的初始化 gin 路由器:

router := gin.New()
router.GET(...)
router.POST(...)

router.Run(addr) 调用将在 addr 上启动一个单独的 HTTP 服务器。

有什么方法可以在不运行单独的 HTTP 服务器的情况下使用此路由器处理 Handle 函数中的传入连接?

最佳答案

创建一个 net.Listener通过在 channel 上接收来接受连接的实现:

type listener struct {
ch chan net.Conn
addr net.Addr
}

// newListener creates a channel listener. The addr argument
// is the listener's network address.
func newListener(addr net.Addr) *listener {
return &listener{
ch: make(chan net.Conn),
addr: addr,
}
}

func (l *listener) Accept() (net.Conn, error) {
c, ok := <-l.ch
if !ok {
return nil, errors.New("closed")
}
return c, nil
}

func (l *listener) Close() error { return nil }

func (l *listener) Addr() net.Addr { return l.addr }

通过发送到 channel 来处理连接:

func (l *listener) Handle(c net.Conn) error {
l.ch <- c
return nil
}

以下是将它们联系在一起的方法:

  • 创建监听器:

      s := newListener(someAddr)
  • 照常配置 Gin 引擎。

      router := gin.New()
    router.GET(...)
    router.POST(...)
  • 使用 channel 监听器和 Gin 引擎在 goroutine 中运行 net/http 服务器:

      err := http.Serve(s, router)
    if err != nil {
    // handle error
    }
  • 在您的调度代码中,调用 s.Handle(c) 将连接传递到 net/http 服务器,然后传递到 Gin 引擎。

关于golang : serving net. Conn 使用 gin 路由器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71148822/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com