登录
首页 >  Golang >  Go问答

服务器如何向客户端发送信号,在收到 os.Interrupt 信号后

来源:stackoverflow

时间:2024-02-11 09:24:24 226浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《服务器如何向客户端发送信号,在收到 os.Interrupt 信号后》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

在我的代码中,我在关闭之前正在监听 os.interrupt

package main

import (
    "net/http"
    "os"
    "os/signal"
    "syscall"
)

var passer *datapasser

const maxclients = 1

func 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 main

import (
    "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")

            switch {
            case len(data.event) > 0:
                fmt.Fprintf(w, "event: %v\ndata: %v\n\n", data.event, data.message)
            case len(data.event) == 0:
                fmt.Fprintf(w, "data: %v\n\n", data.message)
            }
            flusher.Flush()
        case <-r.Context().Done():
            <-p.connection
            fmt.Println("Connection closed")
            return
        }
    }
}

func Connect() {
   // Doing data manipulation, and sending reselt to the `parser`
   passer.data <- sseData{
            event:   "notification",
            message: "Reconnecting to WhatsApp server ...",
   }
}

我的问题是,如果用户使用 ctrl+c 中断应用程序,main 函数正在响应它,我需要它将数据发送到 parser 以便处理程序向客户端发送服务器已关闭的通知关闭


正确答案


我找到了解决方案,它很简单,只需将日期传递给 parser 即可,它在 os.interupt 范围内定义为全局变量,如下所示:

    <-c
    if client.IsConnected() {
        passer.data <- sseData{
            event:   "notification",
            message: "Server is shut down at the host machine...",
        }
        client.Disconnect()
    }

今天关于《服务器如何向客户端发送信号,在收到 os.Interrupt 信号后》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>