Go语言 从http请求函数调用TCP send(网络包)

qrjkbowd  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(155)

我是Go新手-以下问题:我的程序收到一个http post请求,现在我想把数据从它转发到一个活动的TCP连接(程序运行一个并行TCP服务器)。在main()中,处理程序是这样注册的:http.HandleFunc("/rcvtelegram", handleRestRequest)
因此HTTP处理程序函数如下所示:
func handleRestRequest(w http.ResponseWriter, r *http.Request) {}
到客户端的TCP连接是用main()知道的net.Conn对象打开的。所以理想情况下我会用一个TCP sender函数启动一个go例程,监听一个传入的字符串,然后通过TCP发送它。但是怎么做呢?对于通道,我似乎必须传递所有参数,但是我在http处理函数中没有连接对象。我还想避免把tcp连接作为一个全局变量。我看到了观察者模式,但作为一个新手,它的复杂性让我感到害怕(不确定它是否解决了我的问题)。
谢谢你!

vuktfyat

vuktfyat1#

使用一个struct类型来保存通道。在该类型上实现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
}

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

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

使用通道建立 *RestHandler的值,并将它注册为行程常式:

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

xe55xuns2#

基于以上建议,我这样构建了它:

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)

工作正常!

相关问题