在我的代碼中,我os.Interrupt在關閉之前收聽了以下內容package mainimport ( "net/http" "os" "os/signal" "syscall")var passer *DataPasserconst maxClients = 1func init() { passer = &DataPasser{ data: make(chan sseData), logs: make(chan string), connection: make(chan struct{}, maxClients), }}func main() { http.HandleFunc("/sse", passer.HandleSignal) go http.ListenAndServe(":1234", nil) // Listen to Ctrl+C (you can also do something else that prevents the program from exiting) c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) <-c if client.IsConnected() { client.Disconnect() }}這passer.HandleSignal是一個將 SSE 發送Server Sent Event到客戶端的函數,如下所示:package mainimport ( "fmt" "net/http")type sseData struct { event, message string}type DataPasser struct { data chan sseData connection chan struct{} // To control maximum allowed clients connections}func (p *DataPasser) HandleSignal(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/event-stream; charset=utf-8") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") fmt.Println("Client connected from IP:", r.RemoteAddr) p.connection <- struct{}{} flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "Internal error", 500) return } fmt.Fprint(w, "event: notification\ndata: Connection to WhatsApp server ...\n\n") flusher.Flush() // Connect to the WhatsApp client go Connect() for { select { case data := <-p.data: fmt.Println("recieved") 我的問題是,如果用戶使用 Ctrl+C 中斷了應用程序,該main函數正在響應它,我需要它向它發送數據,parser以便處理程序向客戶端發送服務器已關閉的通知
1 回答

HUX布斯
TA貢獻1876條經驗 獲得超6個贊
我找到了解決方案,它很簡單,只需將日期傳遞給parser在 os.interupt 范圍內定義為全局變量的對象,如下所示:
<-c
if client.IsConnected() {
passer.data <- sseData{
event: "notification",
message: "Server is shut down at the host machine...",
}
client.Disconnect()
}
- 1 回答
- 0 關注
- 103 瀏覽
添加回答
舉報
0/150
提交
取消