golang httphandler获取client关闭连接的信号

  • 方法如下a.get_taskrs(tid,w.(http.CloseNotifier).CloseNotify()),使用的是response里面的一个关闭的通知选项

  • 中间尝试使用defer+指针的方式然而并没有什么卵用

    • 1
      2
      3
      4
      5
      func httphandler(){
      i := 0
      defer f(){i = 1;log.Println("Close")}
      a.get_taskrs(tid,&i)
      }
    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      func(a *Agent)get_taskrs(tid int,f *int)(ts shell.TaskStatus){
      i := 0
      for{
      ts := a.get_taskr(tid)
      if ts.Status != 0 || *f > 0 || i>10{
      break
      }
      i++
      }
      }//使用defer这种方法的前提是以为客户端断开连接之后handler返回,然后在返回之前告知get_taskrs别再get了,但是开始怎么样也不会返回即便是关闭了连接,也不会打出close于是猜测handler在等待get_taskrs返回,于是就加了一个flag i来测试,发现真的是这样!!简直是个先有鸡还是先有蛋的问题,也不对。。。主要是close连接之后handler并不会return而是无线等待
    • 于是改成了如下这种形式:

    • 1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      ts = a.get_taskrs(tid,w.(http.CloseNotifier).CloseNotify())
      func (a *Agent)get_taskrs(tid int,cb <- chan bool)(ts shell.TaskStatus){
      tag:
      for{
      select{
      case <- time.After(1 * time.Second):
      ts := a.get_taskr(tid)
      log.Println("Get:",ts)
      if ts.Status != 0{
      break tag
      }
      case <- cb:
      break tag
      }
      }
      return ts
      }
    • Done

    • 还有一种思路,就是使用go里面的闭包https://medium.com/@matryer/the-http-handler-wrapper-technique-in-golang-updated-bc7fbcffa702