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

spl*_*urf 0 javascript tcp tcplistener websocket rust

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

\n

TCP 服务器Rust

\n
use std::{\n    io::Read,\n    net::{Shutdown::Both, TcpListener, TcpStream},\n    thread::spawn,\n};\n\nfn handle_client(mut stream: TcpStream) {\n    let mut data = [0 as u8; 50]; // using 50 byte buffer\n    while match stream.read(&mut data) {\n        Ok(_size) => {\n            //println!("{:?}", String::from_utf8(data[0..size].to_vec()));\n\n            // stream.write(&data[0..size]).unwrap();\n            true\n        }\n        Err(_) => {\n            println!(\n                "An error occurred, terminating connection with {}",\n                stream.peer_addr().unwrap()\n            );\n            stream.shutdown(Both).unwrap();\n            false\n        }\n    } {}\n}\n\nfn main() {\n    let address = "localhost";\n    let port = "80";\n\n    let listener = TcpListener::bind(format!("{}:{}", address, port)).unwrap();\n    println!("{}", format!("Server listening on port {}", port));\n    for stream in listener.incoming() {\n        match stream {\n            Ok(stream) => {\n                println!("New connection: {}", stream.peer_addr().unwrap());\n                spawn(move || {\n                    handle_client(stream);\n                });\n            }\n            Err(e) => {\n                println!("Error: {}", e);\n            }\n        }\n    }\n    // close the socket server\n    drop(listener);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

客户端Javascript

\n
function connect() {\n    let address = "localhost";\n    let port = "80";\n\n    console.log(`Attempting to connect to ${address} at ${port}...`);\n    let socket = new WebSocket(`wss://${address}:${port}`);\n\n    socket.onmessage = function(event) {\n        console.log(`Message :: ${event.data}`)\n    };\n\n    socket.onclose = function(event) {\n        console.log(`Closed :: ${event.code} :: ${event.reason}`);\n    };\n\n    socket.onerror = function(error) {\n        console.log(`Error :: ${error.message}`)\n    };\n}\n
Run Code Online (Sandbox Code Playgroud)\n

按主页上的LoginRegister按钮使其尝试连接后控制台的输出如下:

\n
Attempting to connect to localhost at 80... main.js:8:13\nFirefox can\xe2\x80\x99t establish a connection to the server at wss://localhost:80/. main.js:9:17\nError :: undefined main.js:20:17\nClosed :: 1006 :: \n
Run Code Online (Sandbox Code Playgroud)\n

服务器端也有实际接收连接的反馈:

\n
Server listening on port 80\nNew connection: [::1]:64374\n
Run Code Online (Sandbox Code Playgroud)\n

为什么连接不保持?Firefox 出现此错误是怎么回事?

\n

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

\n

Kel*_*ofs 5

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

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

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