运行 同一端口上的 websocket 和 http 服务器(Rust、hyper)
Running websocket and http server on the same port (Rust, hyper)
我想使用 Rust、Hyper 和 websocket-rs 编写一个网络服务器。 Web 服务器必须能够在同一端口 上处理http 请求和websocket 请求。我使用了官方示例(async-server.rs
:https://github.com/cyderize/rust-websocket/blob/master/examples/async-server.rs)并尝试修改它。我的想法是改变错误处理。如果客户端的请求是一个简单的 http 请求,那么不要 return 一个错误,而是产生一个处理请求的未来。
根据另一个 SO 问题 (How do I handle an error when using rust-websocket so that only that connection fails and not the entire program?),我更改了示例中的错误处理。
这是旧代码:
.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
),但编译器从来不喜欢我所做的。 (我可以粘贴一些编译器错误,但我认为它们不会提高我 post 的质量。)
这是我的问题:编写可以处理同一端口上的 http 请求和 websocket 请求的异步服务器的推荐方法是什么?如果我的方法是正确的:你能帮我填写 SPAWN THE FUTURE
行吗?
其他背景信息(如果您还没有注意到的话):我是一个彻头彻尾的 Rust 初学者。
rust-websocket 文档中似乎有一些关于此的文档 here
从文档粘贴:
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();
我想使用 Rust、Hyper 和 websocket-rs 编写一个网络服务器。 Web 服务器必须能够在同一端口 上处理http 请求和websocket 请求。我使用了官方示例(async-server.rs
:https://github.com/cyderize/rust-websocket/blob/master/examples/async-server.rs)并尝试修改它。我的想法是改变错误处理。如果客户端的请求是一个简单的 http 请求,那么不要 return 一个错误,而是产生一个处理请求的未来。
根据另一个 SO 问题 (How do I handle an error when using rust-websocket so that only that connection fails and not the entire program?),我更改了示例中的错误处理。
这是旧代码:
.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
),但编译器从来不喜欢我所做的。 (我可以粘贴一些编译器错误,但我认为它们不会提高我 post 的质量。)
这是我的问题:编写可以处理同一端口上的 http 请求和 websocket 请求的异步服务器的推荐方法是什么?如果我的方法是正确的:你能帮我填写 SPAWN THE FUTURE
行吗?
其他背景信息(如果您还没有注意到的话):我是一个彻头彻尾的 Rust 初学者。
rust-websocket 文档中似乎有一些关于此的文档 here
从文档粘贴:
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();