2015-08-20 16 views
5

Zajmuję czatów opartych na Twitterze hashtag z serwera wysyłane zdarzenia, z pakietem https://github.com/antage/eventsourceEventource golang: jak wykryć rozłączenie klienta?

Mam problem dotyczący odłączenia klienta. Używam goroutine do wysyłania wiadomości do klienta, ale kiedy klient się rozłącza, goroutine nadal działa.

Nie wiem, jak wykryć po stronie serwera, że ​​klient jest odłączony.

func (sh StreamHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { 

    es := eventsource.New(
     &eventsource.Settings{ 
      Timeout:  2 * time.Second, 
      CloseOnTimeout: true, 
      IdleTimeout: 2 * time.Second, 
      Gzip:   true, 
     }, 
     func(req *http.Request) [][]byte { 
      return [][]byte{ 
       []byte("X-Accel-Buffering: no"), 
       []byte("Access-Control-Allow-Origin: *"), 
      } 
     }, 
    ) 

    es.ServeHTTP(resp, req) 

    go func() { 
     var id int 
     for { 
      id++ 
      time.Sleep(1 * time.Second) 
      es.SendEventMessage("blabla", "message", strconv.Itoa(id)) 
     } 
    }() 

} 

Odpowiedz

3

Można sprawdzić ConsumersCount():

go func() { 
     var id int 
     for es.ConsumersCount() > 0 { 
      id++ 
      es.SendEventMessage("blabla", "message", strconv.Itoa(id)) 
      time.Sleep(1 * time.Second) 
     } 
     fmt.Println("closed") 
    }() 

Kinda hacky, ale wydaje się działać.

Być może lepiej będzie, jeśli użyjesz innej paczki lub przetasujesz ją, aby mieć lepszą kontrolę nad czasem życia swoich goroutin. Możesz wykryć zamknięte połączenie na .Write (którego ten pakiet nie eksponuje).

Jeśli chcesz tutaj przykładowy serwer czatu w TCP: chat-server. I samouczek wideo z tym: tutorial.

Ten sam podstawowy wzór powinien działać dla SSE.

+0

Dzięki za odpowiedź. Mój problem polega na tym, że pakiet, którego używam, nie proponuje funkcji ConsumerCount(). – GuillaumeP

3

Można użyć numeru CloseNotifier, który informuje, czy podstawowe połączenie HTTP zostało zamknięte. Jak:

notify := w.(http.CloseNotifier).CloseNotify() 
go func() { 
    <-notify 
    // connection close, do cleanup, etc. 
}() 

HTH