dongmeng4742 2015-09-29 12:33
浏览 33
已采纳

读取客户端上未缓冲的服务器发送事件

I need to read sse in my golang app, but instead of real-time, events return buffered. As I can see, this is because of standard golang transport. How can I fix this, without implementing my own transport? This code is inspired by cryptix solution:

resp, _ := http.Get(sseURL)
events := make(chan Event)
wg:= sync.WaitGroup{}
wg.Add(1)
go func() {
    event:= Event{}
    reader := bufio.NewReader(resp.Body)

    for {
        line, err := reader.ReadBytes('
')

        if err != nil {
            log.Println(os.Stderr, "error during resp.Body read:%s
", err)
            close(events)
        }

        json.Unmarshal(line,&event)

        events<-event
    }
    wg.Done()
}()

go func(){
    for ev:= range events {
        log.Println(ev)
    }
}()
wg.Wait()
  • 写回答

1条回答 默认 最新

  • doumei1955 2015-09-30 11:03
    关注

    I figured out, data was buffered by nginx, because of transparent compression. So, to get data without delay we must disable compression like this:

    client := &http.Client{}
    transport := &http.Transport{}
    transport.DisableCompression = true
    client.Transport = transport
    req, err := http.NewRequest("GET", essURL, nil)
    if err != nil {
        log.Fatal(err);
    }
    resp, _ := client.Do(req)
    
    reader := bufio.NewReader(resp.Body)
    for {
        line,_:=reader.ReadSlice('
    ')
        log.Println(string(line))       
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 前端echarts坐标轴问题
  • ¥15 CMFCPropertyPage
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳