在Javascript中重新启动服务器后,WebSocket无法重新连接

bkkx9g8r  于 2022-11-11  发布在  Java
关注(0)|答案(1)|浏览(224)

我有一个简单的客户端脚本,如下所示:

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,但不起作用。

gopyfrb3

gopyfrb31#

答案其实很简单。出于某种原因,当我把ws变量放在connect()函数之外,并在函数中修改它时,它就起作用了。我猜它会重新声明/重新创建ws变量。它看起来像这样:

var ws = null;

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

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

connect();

重新启动服务器并重新连接后:

>> window.api.ws_isOpen()
true

我觉得我应该知道这是怎么回事...

相关问题