为了账号安全,请及时绑定邮箱和手机立即绑定

使用通道将时间推送到浏览器

使用通道将时间推送到浏览器

Go
潇潇雨雨 2022-12-19 21:09:00
我正在尝试使用频道将时间推送到浏览器,所以我写了以下内容:package mainimport (    "net/http"    "time")type DataPasser struct {    logs chan string}func main() {    passer := &DataPasser{logs: make(chan string)}    go func() {        for {            passer.logs <- time.Now().String()        }    }()    http.HandleFunc("/", passer.handleHello)    http.ListenAndServe(":9999", nil)}func (p *DataPasser) handleHello(w http.ResponseWriter, r *http.Request) {    for {        w.Write([]byte(<-p.logs))    }    /*  for {            io.WriteString(w, <-p.logs)        }    */}它通过在每个新时间不断添加新行来工作,如下所示:我需要的是单行,每次服务器向它发送时间时,它都会被清除并替换为新时间?有帮助吗?
查看完整描述

1 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

应用程序必须以文本/事件流格式编写响应:


fmt.Fprintf(w, "data: %s\n\n", <-p.logs)

还有其他问题。当客户端断开连接或写入响应时出现错误时,处理程序应退出。处理程序应在等待第一个事件之前刷新标头。这是更新后的代码:


func (p *DataPasser) handleHello(w http.ResponseWriter, r *http.Request) {

    setupCORS(w, r)

    w.Header().Set("Content-Type", "text/event-stream")

    flusher, ok := w.(http.Flusher)

    if !ok {

        http.Error(w, "Internal error", 500)

        return

    }

    flusher.Flush()

    done := r.Context().Done()

    defer fmt.Println("EXIT")

    for {

        select {

        case <-done:

            // the client disconnected

            return

        case m := <-p.logs:

            if _, err := fmt.Fprintf(w, "data: %s\n\n", m); err != nil {

                // Write to connection failed. Subsequent writes will probably fail.

                return

            }

            flusher.Flush()

        }

    }

}


查看完整回答
反对 回复 2022-12-19
  • 1 回答
  • 0 关注
  • 47 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信