从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编程了
我是 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编程了