簡體   English   中英

如何通過 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 甚至可以使用常規套接字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM