在同一端口上运行websocket和http服务器(Rust,hyper)
我想用Rust,Hyper和websocket-rs编写一个web服务器。 Web服务器必须能够处理同一端口上的 http请求和websocket请求。 我使用了官方示例( async-server.rs
)并尝试对其进行修改。 我的想法是改变错误处理。 如果客户端的请求是一个简单的http请求,那么不要返回错误,而是产生一个处理请求的未来。
基于另一个SO问题(如何处理使用rust-websocket时的错误,以便只有该连接失败,而不是整个程序?)我更改了示例中的错误处理。
这是旧的代码:
.map_err(|InvalidConnection {error, ..}| {
println!("Error:{:?}",error);
return error;
})
这是我的新代码:
.map(Some).or_else(|_| -> Result<_, ()> {
// SPAWN THE FUTURE
Ok(None)
})
这是我卡住的地方。 示例代码调用函数spawn_future
,该函数需要一个参数( upgrade.reject()
),该参数在我的代码中不可用,因为我无法访问upgrade
结构。 我尝试了一些其他的东西(即调用handle.spawn_fn
),但编译器从来不喜欢我所做的。 (我可以粘贴一些编译器错误,但我认为他们不会改进我的文章的质量。)
这里是我的问题 :什么是建议的方式来编写一个异步服务器,可以处理HTTP请求和websocket请求在同一个端口? 如果我的方法是正确的:你能帮我填补SPAWN THE FUTURE
系列吗?
额外的上下文(如果你还没有注意到):我是一个完全的Rust初学者。
在这里的rust-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();
链接地址: http://www.djcxy.com/p/40261.html
上一篇: Running websocket and http server on the same port (Rust, hyper)
下一篇: rust, WebAssembly, and passing arguments for increased total memory