从http请求函数调用TCP发送(网络包)

Call TCP send (net package) from http request function

我是 Go 的新手 - 以下问题:我的程序收到一个 http post 请求,现在我想将数据从它转发到一个活动的 TCP 连接(该程序运行一个并行的 TCP 服务器)。 在 main() 中,处理程序是这样注册的: http.HandleFunc("/rcvtelegram", handleRestRequest)

因此 http-handler 函数是这样的:

func handleRestRequest(w http.ResponseWriter, r *http.Request) {}

与客户端的 TCP 连接是用 main() 知道的 net.Conn 对象打开的。所以理想情况下,我会启动一个带有 TCP 发送器函数的 go 例程,该函数侦听传入的字符串以通过 TCP 发送它。但是怎么办?对于通道,我似乎必须传递所有参数,但我在 http 处理程序函数中没有连接对象。我还想避免使 tcp 连接成为全局变量。我看到了观察者模式,但作为新手,它的复杂性让我感到害怕(不确定它是否解决了我的问题)。

谢谢!

使用结构类型来保存频道。在类型上实现 http.Handler 接口:

type RestHandler struct {
    ch chan string
}

func (h *RestHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // insert body of the handleRestRequest here.
    // Use h.ch <- someString to send string to connection
}

在您的主函数中,为 TCP 发送方创建一个通道并在 goroutine 中启动发送方:

ch := make(chan string)
go tcpSender(ch)

使用通道创建 *RestHandler 的值并将其注册为处理程序:

http.Handle("/rcvtelegram", &RestHandler{ch:ch})

基于以上建议我是这样构建的:

type TcpHandler struct {
    connection net.Conn
}

然后定义了一个自定义 HTTP 处理程序:

func (t TcpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {...}

然后用main()中现有的TCP连接注册它:

httpTcpHandler := TcpHandler{connection: conn}
mux := http.NewServeMux()
mux.Handle("/rcvtelegram", httpTcpHandler)
go startHttpServer(httpPort, mux)

正常工作!越来越喜欢Go编程了