Почему веб-сокет выдает ошибку при подключении к серверу?

Я пытаюсь подключиться к веб-сокету на сервере, к которому сокет выдает ошибку о том, что не удалось подключиться.

Код ржавчины:

use axum::{
    extract::{ws::WebSocket, WebSocketUpgrade},
    response::IntoResponse,
    routing::get,
    Router,
};
use tokio::net::TcpListener;
use tower_http::services::ServeDir;

#[tokio::main]
async fn main() {
    let listener = TcpListener::bind("localhost:3000").await.unwrap();
    axum::serve(listener, router()).await.unwrap();
}

fn router() -> Router {
    Router::new()
        .route("/message_list", get(hello_world))
        .nest_service("/", ServeDir::new("static"))
}

async fn hello_world(ws: WebSocketUpgrade) -> impl IntoResponse {
    let _res = ws.on_upgrade(|ws| socet_handler(ws));
}

async fn socet_handler(mut ws: WebSocket) {
    println!("IT READY!");
    let _res = ws.send(axum::extract::ws::Message::Text("hi".to_string()));
}

js-код:

let socket = new WebSocket("ws://localhost:3000/message_list")

Я также пытался изменить «ws» на «wss» в URL-адресе, но это не помогло. на сайте постоянная ошибка:

Соединение WebSocket с «ws://localhost:3000/message_list» не удалось

С чем это может быть связано?

Вы не сможете использовать wss:// без слоя TLS.

tadman 29.04.2024 23:26

А) Вы уверены, что служба Rust запущена и принимает соединения? Можете ли вы подтвердить это с помощью другого инструмента, например curl? Б) Они оба находятся на одной локальной машине? Один из них находится в контейнере, где localhost находится относительно него?

tadman 29.04.2024 23:27

да, сервис ржавчины запущен и принимает соединения, функция "soket_handler" имеет команду, которая отправляет сообщение при подключении, и она срабатывает корректно при каждом запуске. оба они находятся на одной локальной машине

user24168305 29.04.2024 23:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш socet_handler не поддерживает соединение с веб-сокетом, он отправляет сообщение, а затем немедленно завершает функцию - удаляя веб-сокет.

Попробуйте добавить цикл прослушивания сообщений, как описано в документации:

async fn socet_handler(mut socket: WebSocket) {
    println!("IT READY!");
    let _res = ws.send(axum::extract::ws::Message::Text("hi".to_string())).await;

    while let Some(msg) = socket.recv().await {
        // handle the message
    }
}

Ваш код также отбрасывает ответ, созданный из on_upgrade, и вместо этого возвращает пустой (()) ответ. Удалите часть let _res = и дайте ей вернуться следующим образом:

async fn hello_world(ws: WebSocketUpgrade) -> impl IntoResponse {
    ws.on_upgrade(|ws| socet_handler(ws))
}

Вы также не .await совершали send звонок, а это значит, что он на самом деле не был отправлен.

Другие вопросы по теме