2015-10-09 7 views
9

मैं इससॉवे में वेबस्केट पर सर्वर-पुश को कैसे कार्यान्वित करें?

let echo (ws: WebSocket) = 
    fun ctx -> socket { 
     let loop = ref true    
     while !loop do 
      let! message = Async.Choose (ws.read()) (inbox.Receive()) 
      match message with 
      | Choice1Of2 (wsMessage) -> 
       match wsMessage with 
       | Ping, _, _ -> do! ws.send Pong [||] true 
       | _ ->() 
      | Choice2Of2 pushMessage -> do! ws.send Text pushMessage true 
    } 

की तरह कुछ लिख सकते हैं या मैं पढ़ने-लिखने की समवर्ती के लिए 2 अलग सॉकेट लूप की ज़रूरत है?

उत्तर

2

वहाँ Async.Choose के उचित कार्यान्वयन (इस मामले में कम से कम के लिए) नहीं है, इसलिए हम समवर्ती पढ़ने-लिखने की लिए दो async पाश की जरूरत है; इस का उपयोग कर Async.Choose (वहाँ कार्यान्वयन का एक समूह है - हालांकि मैं यकीन नहीं है, जहां ज्यादातर विहित एक है) और अधिक विस्तार

9

के लिए this देख मुझे लगता है कि आप को हल कर सकते हैं।

उसने कहा, आप निश्चित रूप से दो loops बना सकते हैं - socket { .. } के अंदर पढ़ने वाला एक ताकि आप वेब सॉकेट से डेटा प्राप्त कर सकें; लेखन सामान्य async { ... } ब्लॉक हो सकता है।

let echo (ws: WebSocket) = 
    // Loop that waits for the agent and writes to web socket 
    let notifyLoop = async { 
     while true do 
     let! msg = inbox.Receive() 
     do! ws.send Text msg } 

    // Start this using cancellation token, so that you can stop it later 
    let cts = new CancellationTokenSource() 
    Async.Start(notifyLoop, cts.Token) 

    // The loop that reads data from the web socket 
    fun ctx -> socket { 
     let loop = ref true    
     while !loop do 
      let! message = ws.read() 
      match message with 
      | Ping, _, _ -> do! ws.send Pong [||] true 
      | _ ->() } 
+0

आप इस मामले के लिए एक अच्छा Async.Choose-कार्यान्वयन का सुझाव दें सकता है:

कुछ इस तरह चाल करना चाहिए? और बहुत लूप के बारे में: यह [यह] है (https://github.com/SuaveIO/suave/issues/307#issuecomment-146873334) अच्छा? धन्यवाद! –

+1

मुझे लगता है कि आपके दो-लूप के कार्यान्वयन में थ्रेड-सुरक्षित समस्या है (2 धागे से लिखें) –

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