2017-08-21 16 views
7

पर वेबसाइकिल और http सर्वर चलाना मैं जंग, हाइपर और websocket-rs का उपयोग कर एक वेबसर्वर लिखना चाहता हूं। वेबसर्वर एक ही पोर्ट पर http अनुरोध और websocket अनुरोध को संभालने में सक्षम होना चाहिए। मैंने आधिकारिक नमूना (async-server.rs: https://github.com/cyderize/rust-websocket/blob/master/examples/async-server.rs) का उपयोग किया और इसे संशोधित करने का प्रयास किया। मेरा विचार त्रुटि प्रबंधन को बदलना था। यदि ग्राहक का अनुरोध एक साधारण http अनुरोध है तो एक त्रुटि वापस न करें, लेकिन भविष्य के लिए अनुरोध करें जो इसके बजाय अनुरोध को संभालता है।एक ही बंदरगाह (जंग, हाइपर)

किसी अन्य SO प्रश्न (How do I handle an error when using rust-websocket so that only that connection fails and not the entire program?) के आधार पर मैंने नमूना से त्रुटि प्रबंधन को बदल दिया।

.map(Some).or_else(|_| -> Result<_,()> { 
    // SPAWN THE FUTURE 
    Ok(None) 
}) 

यह वह जगह है जहाँ मैं अटक कर रहा हूँ:

.map_err(|InvalidConnection {error, ..}| { 
    println!("Error:{:?}",error); 
    return error; 
}) 

यह मेरा नया कोड है:

इस पुराने कोड है। नमूना कोड एक फंक्शन spawn_future कहते हैं, जो पैरामीटर (upgrade.reject()) की अपेक्षा करता है जो मेरे कोड में उपलब्ध नहीं है क्योंकि मेरे पास upgrade संरचना तक पहुंच नहीं है। मैंने कुछ अन्य चीजों की कोशिश की (यानी handle.spawn_fn पर कॉल करना) लेकिन संकलक को मैंने कभी पसंद नहीं किया। (मैं संकलक त्रुटियों के कुछ पेस्ट कर सकता है, लेकिन मुझे नहीं लगता है कि वे अपनी पोस्ट की गुणवत्ता में सुधार होगा।)

यहाँ मेरे सवाल है: एक अतुल्यकालिक सर्वर जो संभाल कर सकते हैं लिखने के लिए सिफारिश की तरीका क्या है एक ही बंदरगाह पर http अनुरोध और websocket अनुरोध? यदि मेरा दृष्टिकोण सही है: क्या आप कृपया SPAWN THE FUTURE लाइन भरने में मेरी सहायता कर सकते हैं?

अतिरिक्त संदर्भ (यदि आपने अभी तक ध्यान नहीं दिया है): मैं कुल जंग की शुरुआत कर रहा हूं।

उत्तर

3

वहाँ डॉक्स से here

चिपकाया जा रहा है जंग-WebSocket दस्तावेज में इस पर कुछ डॉक्स हो रहा है:

use hyper::server::{Server, Request, Response}; 
use websocket::Message; 
use websocket::sync::server::upgrade::IntoWs; 
use websocket::sync::server::upgrade::HyperRequest; 

Server::http("0.0.0.0:80").unwrap().handle(move |req: Request, res: Response| { 
    match HyperRequest(req).into_ws() { 
     Ok(upgrade) => { 
      // `accept` sends a successful handshake, no need to worry about res 
      let mut client = match upgrade.accept() { 
       Ok(c) => c, 
       Err(_) => panic!(), 
      }; 

      client.send_message(&Message::text("its free real estate")); 
     }, 

     Err((request, err)) => { 
      // continue using the request as normal, "echo uri" 
      res.send(b"Try connecting over ws instead.").unwrap(); 
     }, 
    }; 
}) 
.unwrap(); 
+1

धन्यवाद। यह प्रलेखन में अच्छी तरह छुपा था। मुझे यह नहीं मिला होता। – cruppstahl