簡體   English   中英

Websocket在Javascript中重啟服務器后無法重新連接

[英]Websocket is unable to reconnect after restarting the server in Javascript

我有一個像這樣的簡單客戶端腳本:

function connect() {
    const { contextBridge } = require('electron');

    var ws = new WebSocket('ws://localhost:3000');
    ws.onerror = (error) => {
        console.error(`Lost connection to server. Reason: ${error.message}`);
        console.error('Attempting to reconnect...');
        ws.close();
    }

    ws.onclose = (e) => {
        setTimeout({
            connect();
        }, 500);
    }

    ws.addEventListener('open', () => {
        console.log('Connected to server!');
    });

    // Some other stuff to call functions via the browser console
    const API = {
        ws_isOpen: () => { return ws.readyState === ws.OPEN }
    }
    contextBridge.exposeInMainWorld('api', API);

    function send_msg(msg) {
        // Process some data...
        ws.send(msg);
    }
}

connect();

當服務器正在運行並嘗試連接時,它可以正常工作,或者當服務器重新啟動並且第一次嘗試連接時,但在連接時不能正常工作。 我的意思是,如果我在客戶端連接到服務器時突然關閉服務器,它會嘗試像往常一樣嘗試重新連接,並且會彈出成功消息。 但是,如果我在瀏覽器控制台中輸入window.api.ws_isOpen() ,它會返回false 當我嘗試發送消息時,會彈出一條錯誤消息,提示Websocket is already in CLOSING or CLOSED stage類的內容。 我嘗試將ws變量類型更改為letconst但它不起作用。

原來答案很簡單。 出於某種原因,當我將ws變量放在connect() function 之外並在 function 中對其進行修改時,它可以工作。 我猜它有點重新聲明/重新更新ws變量。 它看起來像這樣:

var ws = null;

function connect() {
    ws = new WebSocket('ws://localhost:3000');

    // the exact same as above here....
}

connect();

重新啟動服務器並讓它重新連接后:

>> window.api.ws_isOpen()
true

我覺得我應該知道這是怎么回事...

暫無
暫無

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

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