当前位置: 首页 > 知识库问答 >
问题:

在同一端口上运行websocket和http服务器(Rust、hyper)

陶锋
2023-03-14

我想用Rust,Hyper和WebSocket-RS编写一个Web服务器。webserver必须能够在同一端口上处理http请求和websocket请求。我使用了正式示例(async-server.rs:https://github.com/cyderize/rust-websocket/blob/master/examples/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行吗?

附加上下文(如果你还没有注意到的话):我是一个全锈初学者。

共有1个答案

刘畅
2023-03-14

这里的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();
 类似资料:
  • 我想在我的web服务器上运行多个非集群垂直市场。每个verticle由一个单独的进程/命令行启动,并为同一个主机和具有唯一路由的同一个端口创建自己的HTTP服务器(vertx.createHttpServer)。然而,这似乎不起作用,因为在开始一个垂直之后,所有进一步的垂直抛出一个BindException“地址已经在使用中”。 作为Vert. x的新手,我只能想到两种方法来通过这个考试: < l

  • 我想部署一个tomcat服务器,以便它同时侦听两个端口(都用于超文本传输协议)。 为了确保您正确理解这个需求,我们只有一个服务器实例,但希望侦听HTTP协议的两个端口。例如,任何人都可以使用端口号7080和8080访问部署在我的服务器中的应用程序 有可能做到吗?如果可能,我们如何实现这一点?

  • 问题内容: 我有一个app.js,用于在接收到一些POST数据时触发两个事件: 将POST数据插入数据库 使用WebSocket向客户端发送消息 这是 app.js (仅重要的 几 行) 这是 server.js (仅重要的 几 行) 我想要实现的是以侦听应用程序相同端口的方式设置WebSocketServer。我考虑过将 服务器 var从 app.js 传递到 server.js, 但是 我认为

  • 问题内容: 我正在使用使用node_redis的kue,但是我已经在会话中使用了,所以我想在特定端口上创建一个服务器,说默认值,然后在port上侦听。 我将如何做到这一点?我发现这篇文章讨论的是类似的内容,但是我并不是真的想要创建一个初始化脚本来执行此操作。 问题答案: 启动redis-server并为“ port”提供一个不同的参数,可以在命令行中完成: 例如,您也可以这样做,以便在启动时进行。

  • 问题内容: 我最近使用了github上的angular-seed文件夹进行角度应用程序开发。在以前的一些angularjs教程中,angular- seed文件夹中有一个脚本文件夹和一个server.js文件,它们具有用于运行节点服务器的所有配置。那么,npm现在如何开始运行节点服务器,该节点服务器的所有配置在哪里? 问题答案: 如果您看一下文件。 你会看到这样的事情 这告诉开始在端口上的地址 h

  • 我在生产服务器上安装SSL时遇到问题。我在端口80上运行Laravel,在端口8080上运行vue js。我已经安装了SSL证书。 但是现在当我试图发送任何请求到8000a时有一个错误: XHR.js:178混合内容:“HTTPS://www.example.com/login”页面是通过HTTPS加载的,但请求的XMLHttpRequestendpoint“http://www.example.