亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從http請求函數調用TCP發送(網絡包)

從http請求函數調用TCP發送(網絡包)

Go
慕森卡 2022-12-19 10:30:40
我是 Go 的新手 - 以下問題:我的程序收到一個 http post 請求,現在我想將數據從它轉發到一個活動的 TCP 連接(該程序運行一個并行的 TCP 服務器)。在main()處理程序中注冊如下: http.HandleFunc("/rcvtelegram", handleRestRequest)因此 http-handler 函數是這樣的:func handleRestRequest(w http.ResponseWriter, r *http.Request) {}到客戶端的 TCP 連接是用一個知道的 net.Conn 對象打開的main()。所以理想情況下,我會啟動一個帶有 TCP 發送器函數的 go 例程,該函數偵聽傳入的字符串以通過 TCP 發送它。但是怎么辦?對于通道,我似乎必須傳遞所有參數,但我在 http 處理程序函數中沒有連接對象。我還想避免使 tcp 連接成為全局變量。我看到了 Observer 模式,但作為新手,它的復雜性讓我感到害怕(不確定它是否解決了我的問題)。
查看完整描述

2 回答

?
互換的青春

TA貢獻1797條經驗 獲得超6個贊

使用結構類型來保存通道。在類型上實現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})


查看完整回答
反對 回復 2022-12-19
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

基于上述建議,我以這種方式構建它:


type TcpHandler struct {

    connection net.Conn

}

然后定義了一個自定義的 HTTP 處理程序:


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

然后將其注冊到現有的 TCP 連接中main():


httpTcpHandler := TcpHandler{connection: conn}

mux := http.NewServeMux()

mux.Handle("/rcvtelegram", httpTcpHandler)

go startHttpServer(httpPort, mux)

正常工作!


查看完整回答
反對 回復 2022-12-19
  • 2 回答
  • 0 關注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號