代码之家  ›  专栏  ›  技术社区  ›  MORAS

60秒后出现Javascript WebSocket 1006错误

  •  -1
  • MORAS  · 技术社区  · 2 年前

    我正试图用websocket和javascript制作一个小型在线浏览器游戏,但websocket在60秒后关闭,错误代码为1006,没有任何原因(没有调用oneror),尽管我每5秒就有一次乒乓球请求。我能够用这个代码复制它:

    // server.js
    
    const ws = require("ws")
    const { createServer } = require("http")
    
    const server = new ws.Server({ noServer: true })
    
    createServer((req, res) => {
        server.handleUpgrade(req, req.socket, Buffer.alloc(0), (socket, req) => {
            socket.on("message", (message) => {
                if (message == "Ping")
                    socket.send("Pong")
    
                console.log(message.toString())
            })
    
            socket.on("close", () => {
                console.log("closed")
            })
    
            socket.on("error", (err) => {
                throw err;
            })
        })
    }).listen(8000, "127.0.0.1")
    
    <!--- index.html --->
    
    <!DOCTYPE html>
    <html>
        <body>
            <script>
                var ws = new WebSocket("ws://127.0.0.1:8000");
                ws.onopen = (ev) => {
                    ws.send("Hello, Server!");
    
                    ws.onmessage = (ev) => {
                        console.log(ev.data);
                    }
                    
                    ws.onclose = (ev) => {
                        console.log(`Closed ${ev.code} : ${ev.reason}`);
                    }
    
                    ws.onerror = (err) => {
                        console.log(err);
                    }
    
                    (async () => {
                        function sleep(ms) {
                            return new Promise(resolve => setTimeout(resolve, ms));
                        }
    
                        while (ws.readyState == 1) {
                            ws.send("Ping");
                            await sleep(5000);
                        }
                    })();
                }
            </script>
        </body>
    </html>
    

    我试着降低乒乓球的睡眠,但它似乎什么都没做,在整整60秒后仍然关闭。它在Chrome、Firefox、Opera和Edge浏览器中出错。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Jaromanda X    2 年前

    我真的不能说服务器为什么会失败,我不知道节点的内部工作原理 http -我怀疑,因为它的做法 http 代码认为没有数据通过套接字,因此最终将其关闭为 inactive

    备选方案1:

    稍微复杂一点,但工作得很好——使用这种方法,您实际上可以在一台服务器上拥有多个websocket实现(参见示例 多个服务器共享一个HTTP/S服务器 如上所述 ws npm页面

    const wss1 = new ws.Server({ noServer: true });
    wss1.on("connection", (socket) => {
        console.log("wss1 connection");
        socket.on("message", (message) => {
            if (message == "Ping") {
                socket.send("Pong");
            }
            console.log(message.toString());
        });
        socket.on("close", () => {
            console.log("closed");
        });
    });
    
    const server = createServer();
    server.on("upgrade", (req, socket, head) => {
        wss1.handleUpgrade(req, socket, head, (ws) => {
            wss1.emit("connection", ws, req);
        });
    });
    server.listen(8000, "127.0.0.1");
    

    备选方案2:

    非常简单的代码

    const server = createServer();
    
    const wss = new ws.Server({ server });
    
    wss.on("connection", (socket) => {
        console.log("wsServer connection");
        socket.on("message", (message) => {
            if (message == "Ping") {
                socket.send("Pong");
            }
            console.log(message.toString());
        });
        socket.on("close", () => {
            console.log("closed");
        });
    });
    server.listen(8000, "127.0.0.1");