如何通过 Javascript 连接到本地 TCP WebSocket?

How to connect to local TCP WebSocket via Javascript?

我有一个本地托管的数据库,需要能够使用 Javascript 访问我拥有 https://nujabes.xyz/ 的网站。对于服务器端,我使用 Rust 托管它,因为我的数据库就是这样写的:

TCP 服务器Rust:

use std::{
    io::Read,
    net::{Shutdown::Both, TcpListener, TcpStream},
    thread::spawn,
};

fn handle_client(mut stream: TcpStream) {
    let mut data = [0 as u8; 50]; // using 50 byte buffer
    while match stream.read(&mut data) {
        Ok(_size) => {
            //println!("{:?}", String::from_utf8(data[0..size].to_vec()));

            // stream.write(&data[0..size]).unwrap();
            true
        }
        Err(_) => {
            println!(
                "An error occurred, terminating connection with {}",
                stream.peer_addr().unwrap()
            );
            stream.shutdown(Both).unwrap();
            false
        }
    } {}
}

fn main() {
    let address = "localhost";
    let port = "80";

    let listener = TcpListener::bind(format!("{}:{}", address, port)).unwrap();
    println!("{}", format!("Server listening on port {}", port));
    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                println!("New connection: {}", stream.peer_addr().unwrap());
                spawn(move || {
                    handle_client(stream);
                });
            }
            Err(e) => {
                println!("Error: {}", e);
            }
        }
    }
    // close the socket server
    drop(listener);
}

客户端Javascript:

function connect() {
    let address = "localhost";
    let port = "80";

    console.log(`Attempting to connect to ${address} at ${port}...`);
    let socket = new WebSocket(`wss://${address}:${port}`);

    socket.onmessage = function(event) {
        console.log(`Message :: ${event.data}`)
    };

    socket.onclose = function(event) {
        console.log(`Closed :: ${event.code} :: ${event.reason}`);
    };

    socket.onerror = function(error) {
        console.log(`Error :: ${error.message}`)
    };
}

按下主页上的 LoginRegister 按钮后控制台的输出如下:

Attempting to connect to localhost at 80... main.js:8:13
Firefox can’t establish a connection to the server at wss://localhost:80/. main.js:9:17
Error :: undefined main.js:20:17
Closed :: 1006 :: 

在服务器端实际收到连接的地方也有反馈:

Server listening on port 80
New connection: [::1]:64374

为什么连接没有保持?这个 Firefox 错误是怎么回事?

上下文:我已经转发了端口 80 以及其他一些端口。

您的服务器似乎在尝试使用常规 TCP 套接字,而您的客户端代码正在使用 WebSockets,它确实使用了 TCP 套接字,但在其之上层叠了一个全新的协议。

确实建立了连接,但在客户端的 WebSocket 握手等过程中,连接失败并因此出错。

你最好找到一个 Rust 库,它允许你创建一个 WebSocket 服务器而不是一个常规的套接字服务器。我不认为客户端 JavaScript 甚至可以使用常规套接字。