2015-08-20 8 views
5

मैं सर्वर भेजे गए ईवेंट के साथ ट्विटर हैशटैग पर आधारित चैट रूम विकसित कर रहा हूं, पैकेज https://github.com/antage/eventsourceघटनाक्रम गोलांग: क्लाइंट डिस्कनेक्शन का पता लगाने के लिए कैसे?

मुझे क्लाइंट के डिस्कनेक्शन से संबंधित कोई समस्या है। मैं क्लाइंट को संदेश भेजने के लिए एक goroutine चलाता हूं, लेकिन जब ग्राहक डिस्कनेक्ट करता है, तो goroutine अभी भी चलता है।

मुझे नहीं पता कि क्लाइंट डिस्कनेक्ट होने वाले सर्वर पक्ष पर कैसे पता लगाना है।

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

} 

उत्तर

3

आप जांच कर सकता है 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") 
    }() 

किंडा hacky है, लेकिन यह काम करने के लिए लगता है।

आप एक अलग पैकेज का उपयोग करके बेहतर हो सकते हैं या अपना खुद का रोलिंग कर सकते हैं ताकि आप अपने goroutines के जीवनकाल पर बेहतर नियंत्रण कर सकें। आप .Write पर एक बंद कनेक्शन का पता लगा सकते हैं (जो यह पैकेज खुलासा नहीं कर रहा है)।

यदि आप यहां टीसीपी में एक उदाहरण चैट सर्वर चाहते हैं: chat-server। और इसके साथ जाने के लिए एक वीडियो ट्यूटोरियल: tutorial

एसएसई के लिए एक ही मूल पैटर्न को काम करना चाहिए।

+0

अपने जवाब के लिए धन्यवाद। मेरी समस्या यह है कि मैं जिस पैकेज का उपयोग कर रहा हूं वह ConsumerCount() फ़ंक्शन का प्रस्ताव नहीं देता है। – GuillaumeP

3

आप CloseNotifier का उपयोग कर सकते हैं जो आपको बताता है कि अंतर्निहित http कनेक्शन बंद है या नहीं। जैसा:

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

HTH

संबंधित मुद्दे