2 回答
TA贡献1836条经验 获得超13个赞
创建一个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 引擎。
TA贡献1820条经验 获得超3个赞
对于那些有类似任务的人 - 使用单个路由器处理来自多个端口的 TCP 连接,这是我最终找到的解决方法。我没有在端口上运行 HTTP 服务器,而是使用 UNIX 套接字运行它router.RunUnix(socketName)。完整的解决方案包括三个步骤:
运行 HTTP 服务器以使用 UNIX 套接字进行侦听
router.RunUnix(socketName)在
Handle函数内部,从连接中读取传入的字节并将它们发送到套接字。之后,从套接字读取 HTTP 响应并将其写入连接。关闭连接。
- 2 回答
- 0 关注
- 258 浏览
添加回答
举报
