为了账号安全,请及时绑定邮箱和手机立即绑定

golang:使用 gin 路由器为 net.Conn 服务

golang:使用 gin 路由器为 net.Conn 服务

Go
翻翻过去那场雪 2022-11-08 16:14:23
我有一个处理传入 TCP 连接的函数:func Handle(conn net.Conn) error {    // ...}另外,我有一个已初始化的带有已实现句柄的 gin 路由器:router := gin.New()router.GET(...)router.POST(...)该router.Run(addr)调用将在addr.有没有办法在Handle不运行单独的 HTTP 服务器的情况下使用此路由器处理函数内部的传入连接?
查看完整描述

2 回答

?
开心每一天1111

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 引擎。


查看完整回答
反对 回复 2022-11-08
?
DIEA

TA贡献1820条经验 获得超3个赞

对于那些有类似任务的人 - 使用单个路由器处理来自多个端口的 TCP 连接,这是我最终找到的解决方法。我没有在端口上运行 HTTP 服务器,而是使用 UNIX 套接字运行它router.RunUnix(socketName)。完整的解决方案包括三个步骤:

  1. 运行 HTTP 服务器以使用 UNIX 套接字进行侦听router.RunUnix(socketName)

  2. Handle函数内部,从连接中读取传入的字节并将它们发送到套接字。之后,从套接字读取 HTTP 响应并将其写入连接。

  3. 关闭连接。


查看完整回答
反对 回复 2022-11-08
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号