在ResponseWriter上进行实时应用程序重写

时间:2015-12-24 07:51:31

标签: web-applications go websocket webserver real-time

我有一个Web应用程序需要继续写入(可能永无止境)到http.ResponseWriter,并将这些输出显示到html页面。它类似于:

func handler(w http.ResponseWriter, req *http.Request) {
     switch req.Method {
         case "GET":
              for {
                  fmt.Fprintln(w, "repeating...")
              }
     }
}

我觉得HTML输出的速度不够快。

如果我想继续写http.ResponseWriter并尽可能快地实时显示HTML,那么最好的方法是什么?

谢谢,

1 个答案:

答案 0 :(得分:3)

默认http.ResponseWriter使用bufio.ReadWriter作为底层连接,缓冲所有写入。如果希望尽可能快地发送数据,则必须在每次写入后刷新缓冲区。

http.Flusher包中有一个net/http接口,由默认http.ResponseWriter实现。

有了这个,您可以按如下方式重写您的示例:

func handler(w http.ResponseWriter, req *http.Request) {
     switch req.Method {
     case "GET":
          for {
              fmt.Fprintln(w, "repeating...")

              if f, ok := w.(http.Flusher); ok {
                  f.Flush()
              }
          }
     }
}

这将在每次写入后刷新内部缓冲区。