Golang的SSE延迟

I'm trying to make console using sse that shows client what server is doing. Currently it does what I want except it has a delay (about 2sec). I added http.Flusher but is seems to do absolutely nothing. I call UpdateLogMessage using goroutines: go UpdateLogMessage("Example")

SSE:

type Upl struct {
    log string
}

var Log chan *Upl

func DashboardHandler(w http.ResponseWriter, r *http.Request) {
    f, ok := w.(http.Flusher)
    if !ok {
        fmt.Println("Streaming unsuported")
    }

    w.Header().Set("Content-Type", "text/event-stream")
    w.Header().Set("Cache-Control", "no-cache")
    w.Header().Set("Connection", "keep-alive")

    msg := <-Log
    fmt.Fprintf(w, "data: %v

", msg.log)
    f.Flush()
}

//Updates log message with curent time and message content
func UpdateLogMessage(msg string) {
    curentTime := time.Now().Format("15:04:05")
    ul := fmt.Sprintf("<%v> %v", curentTime, msg)
    up := &Upl{
        log: ul,
    }
    Log <- up
}

func MakeChan() {
    Log = make(chan *Upl)
}

Javascript:

function onLoaded(){
    var source = new EventSource("sse/dashboard")
    var logg = "";
    var currentmsg = "";

    source.onmessage = function (event){
        var dashboard = event.data;
        //If message changed print it to console
        if (dashboard != currentmsg){
            console.log("OnMessage called:");
            console.dir(event);
            currentmsg = dashboard;
            logg += currentmsg + "<br/>";
            console.log(logg);
            document.getElementById("console").innerHTML = logg;
        }
    }
}
duanhaodi4809
duanhaodi4809 谢谢!延迟可能发生了,因为如您所说,我从处理程序返回的每条消息。现在,我通过添加循环来更改它,使其可以正常工作,但是由于我在开始上传文件时使用了上传表单,因此HTTP连接关闭,并且在上传过程中收到0条消息。我可能需要使用Ajax进行文件上传,以使其正常工作。
一年多之前 回复
dqyuipw44576
dqyuipw44576 并且,如果没有客户端在监听,您将使用goUpdateLogMessage(“Example”)泄漏goroutine,因为它将无法在通道上发送并因此永久挂起。看看这个例子:为什么Golanghttp.ResponseWriter执行被延迟了?
一年多之前 回复
dqst96444
dqst96444 您发布的代码没有说明任何延迟,但是这不是使用(或应使用)SSE的方式。一旦发送回第一条消息,就从处理程序中返回。通常,SSE处理程序具有循环,以不断将更新发送回客户端。同样,从日志通道接收消息的方式也很危险,如果多个客户端连接到SSE端点,它们将争夺消息的接收者,而您不处理上下文取消。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐