2017-08-21 21 views
7

Web tarayıcısını Rust, Hyper ve websocket-rs kullanarak yazmak istiyorum. Web sunucusu, numaralı bağlantı noktasında http isteklerini ve websocket isteklerini yönetebilmelidir. Resmi örneği kullandım (async-server.rs: https://github.com/cyderize/rust-websocket/blob/master/examples/async-server.rs) ve değiştirmeye çalıştım. Benim düşüncem hata işlemeyi değiştirmekti. Müşterinin isteği basit bir http isteği ise, bir hata döndürmeyin, ancak isteği yerine getiren bir geleceği ortaya çıkarın.Websocket ve http sunucusunu aynı bağlantı noktasında çalıştırma (Pas, hiper)

Başka bir soruya dayanarak (How do I handle an error when using rust-websocket so that only that connection fails and not the entire program?) Örneklem hatalarını değiştirdim. Ben takılıp nerede

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

budur: İşte benim yeni kod

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

olduğunu

:

Bu eski kodudur. Örnek kod, upgrade yapısına erişimim olmadığı için kodumda bulunmayan bir parametre (upgrade.reject()) bekleyen bir spawn_future işlevini çağırır. Birkaç şey daha denedim (yani handle.spawn_fn'u arayarak) fakat derleyici yaptığım şeyi hiç sevmedi. (Ben derleyici hataları bazı yapıştırmak olabilir, ama onlar benim yazının kalitesini artırmak olacağını sanmıyorum.) Burada

sorum geçerli: işleyebilir bir zaman uyumsuz sunucuyu yazmak için önerilen yolu nedir Aynı bağlantı noktasında http istekleri ve websocket istekleri? Yaklaşımım doğruysa: SPAWN THE FUTURE hattını doldurmama yardımcı olabilir misiniz?

Ek içerik (henüz farketmediyseniz): Ben tamamen Rust acemi oldum.

cevap

3

here

Yapıştırma dokümanlardan pas WebSocket belgelerinde bu konuda bazı dokümanlar gibi görünüyor:

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

teşekkür ederiz. Bu belgelere iyi gizlenmişti. Onu bulamazdım. – cruppstahl

İlgili konular