如何通过 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}`)
};
}
按下主页上的 Login
或 Register
按钮后控制台的输出如下:
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 甚至可以使用常规套接字。
我有一个本地托管的数据库,需要能够使用 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}`)
};
}
按下主页上的 Login
或 Register
按钮后控制台的输出如下:
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 甚至可以使用常规套接字。