我有一个处理传入 TCP 连接的函数:
func Handle(conn net.Conn) error {
// ...
}
另外,我有一个初始化的 gin 路由器,带有已实现的句柄:
router := gin.New()
router.GET(...)
router.POST(...)
The router.Run(addr)
调用将启动一个单独的 HTTP 服务器addr
.
有什么方法可以处理内部的传入连接Handle
使用此路由器功能而不运行单独的 HTTP 服务器?
创建一个网络监听器 https://pkg.go.dev/net#Listener通过在通道上接收来接受连接的实现:
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 }
通过发送到通道来处理连接:
func (l *listener) Handle(c net.Conn) error {
l.ch <- c
return nil
}
以下是将它们结合在一起的方法:
-
创建监听器:
s := newListener(someAddr)
-
像往常一样配置 Gin 引擎。
router := gin.New()
router.GET(...)
router.POST(...)
-
使用通道监听器和 Gin 引擎在 goroutine 中运行 net/http 服务器:
err := http.Serve(s, router)
if err != nil {
// handle error
}
-
在您的调度代码中,调用s.Handle(c)
将连接传递到 net/http 服务器,然后传递到 Gin 引擎。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)