2012-10-01 21 views
11

मुझे यकीन नहीं है कि मुझे डिफ़ॉल्ट टाइम-आउट का अनुभव हो रहा है (क्या मैं इसे कहीं भी सेट कर सकता हूं?), लेकिन शायद मुझे कुछ याद आ रहा है। जब एक ग्राहक का ब्राउज़र वेबसाइकिल कनेक्शन स्थापित करता है, तो मैं दृढ़ता रखता हूं। फिर, डिस्कनेक्ट पर, मैं उस निरंतर वस्तु को हटा देता हूं। काफी सरल। डिस्कनेक्ट सामान्य रूप से ट्रिगर किया जाता है जब एक ग्राहक ब्राउज़र बंद कर देता है, लेकिन नहीं जब ग्राहक (पर एक मैकबुक प्रो परीक्षण, नहीं है कि इस बात चाहिए) अपने वाई-फाई कनेक्शन बंद हो जाती है।वेबसाइट्स 'हार्ड' डिस्कनेक्ट स्पष्ट नहीं है?

स्काला नियंत्रक में, मैं हर in संदेश लॉग इन करने रहा हूँ, लेकिन कुछ भी नहीं जब वाई-फाई बंद कर दिया है के माध्यम से आता (docs से, मैं एक EOF उम्मीद करेंगे?)।

मुझे लगता है कि यह एक बग, जैसा कि मैंने कैसे की व्याख्या WS protocolसे लिया सर्वर को बंद करना होगा WebSocket कनेक्शन, और समस्या लॉग इन करना चाहिए होना चाहिए। लेकिन बाद वाला नहीं होता है।

val in = Iteratee.foreach[String](x => { 
    logger.info("Websocket msg: " + x) 
    // expect EOF? 
    x match { 
    case "persist" => // persist some object 
    } 
}).mapDone { x => 
    // delete my persisted object (never happens unless browser/tab closed) 
} 

क्या किसी ने इसका अनुभव किया है? मैंने एक सरल नियंत्रक और कुछ ऐसा करने की कोशिश की है जो मेरी कॉन्फ़िगरेशन से मेल खाती है। नीचे ws3 या ws2 नीचे नियंत्रक चाल करते हैं। प्ले! नीचे दिए गए कोड:

object Application extends Controller { 

    private def ws(out: PushEnumerator[String]) = { 

    Logger.logger.info("ws()") 

    val in = Iteratee.foreach[String](x => { 
     Logger.logger.info("Websocket msg: " + x) 
     try { 
     x match { 
      case "persist" => Logger.logger.info("PERSIST") 
     } 
     } catch { 
     case e: Exception => { 
      Logger.logger.info("NOT RECOGNIZED COMMAND, NO PERSIST") 
     } 
     } 
    }).mapDone { x => 
     Logger.logger.info("STOP PERSIST") 
    } 
    in 
    } 

    def ws2() = WebSocket.using[String] { request => 

    Logger.logger.info("ws2()") 

    val out = Enumerator.imperative[String]() 
    val in = ws(out) 

    (in, out) 
    } 

    def ws3() = WebSocket.using[String] { request => 

    Logger.logger.info("ws3()") 

    val out = Enumerator.imperative[String]() 
    val in = Iteratee.foreach[String](x => { 
     Logger.logger.info("Websocket msg: " + x) 
     try { 
     x match { 
      case "persist" => Logger.logger.info("PERSIST") 
     } 
     } catch { 
     case e: Exception => { 
      Logger.logger.info("NOT RECOGNIZED COMMAND, NO PERSIST") 
     } 
     } 
    }).mapDone { x => 
     Logger.logger.info("STOP PERSIST") 
    } 
    (in, out) 
    } 

    def view() = Action { implicit request => 
    Ok(views.html.index.render("")) 
    } 
} 

दृश्य एक सरल है:

@(message: String) @main("Welcome to Play 2.0") { 

@play20.welcome(message) } 

<script type="text/javascript" charset="utf-8"> 
    var sock = new WebSocket("ws://192.168.1.120:9001/ws3"); 

    sock.onopen = function(event) { 
     sock.send('persist'); 
    } 
</script> 

मार्गों:

GET  /ws2       controllers.Application.ws2 
GET  /ws3       controllers.Application.ws3 
GET  /view       controllers.Application.view 

उत्तर

2

इस फ्रेमवर्क विशिष्ट, बल्कि एक नेटवर्क से संबंधित मुद्दे प्ले नहीं है। क्या होता है कि यदि आप सामान्य रूप से डिस्कनेक्ट करते हैं, तो दूसरा अंत FIN पैकेट भेजता है और सर्वर इसके बारे में जानता है। यदि दूसरे छोर में नेटवर्क कनेक्शन नहीं है, तो ऐसा नहीं हो सकता है।

यह निर्धारित करने के लिए कि सॉकेट कब खुला है या नहीं? पढ़ने या लिखने की कोशिश करते समय आपको अपवाद मिलेगा। लेकिन गैर-अवरुद्ध मॉडल के साथ जो स्वयं नहीं होता है। तो आपके मामले में मैं होगा:

  • समय समाप्त है
  • जावास्क्रिप्ट समाप्त अवधि
  • भीतर पिंग्स भेजने कोई पिंग्स आने,

काट देते हैं या सर्वर साइड से पिंग भेजने बनाओ (लिखने सॉकेट के लिए)।

+0

प्रबंधन कुछ ऐसा था जो मुझे डर था। इसे भी मिला - https://code.google.com/p/chromium/issues/detail?id=76358 -। ऐसा लगता है कि यह ढांचे में बनाया गया कुछ होना चाहिए, या कम से कम बात की जानी चाहिए। धन्यवाद! –

+0

इसे पढ़ने के लिए कोई भी - यह "socket.io" सर्वर मेमोरी क्रीप भी इस श्रेणी के अंतर्गत आता है। –

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