2015-08-20 4 views
5

Ich entwickle Chat-Rooms basierend auf Twitter Hashtag mit Server gesendet Ereignisse, mit dem PaketEventsource golang: Wie erkennt man Client-Trennung?

Ich habe ein Problem bezüglich der Trennung des Clients. Ich führe eine Goroutine aus, um Nachrichten an den Client zu senden, aber wenn der Client die Verbindung trennt, läuft die Goroutine weiter.

Ich weiß nicht, auf der Serverseite zu erkennen, dass der Client nicht verbunden ist.

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)) 
     } 
    }() 

} 

Antwort

3

könnten Sie ConsumersCount() überprüfen:

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, aber es scheint zu funktionieren.

Sie können besser mit einem anderen Paket arbeiten oder Ihr eigenes rollen, damit Sie die Lebensdauer Ihrer Goroutines besser kontrollieren können. Sie können eine geschlossene Verbindung unter .Write (die dieses Paket nicht aussetzt) ​​erkennen.

Wenn Sie möchten, hier ist ein Beispiel Chat-Server in TCP: chat-server. Und ein Video-Tutorial dazu: tutorial.

Das gleiche Grundmuster sollte für SSE funktionieren.

+0

Vielen Dank für Ihre Antwort. Mein Problem ist, dass das Paket, das ich verwende, nicht die ConsumerCount() - Funktion vorschlägt. – GuillaumeP

3

Sie können CloseNotifier verwenden, mit dem Sie wissen, ob die zugrunde liegende http-Verbindung geschlossen wurde. Wie:

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

HTH