簡體   English   中英

服務器重新啟動時重新啟動 JavaScript websocket - 為什么此代碼會重新啟動多個 websockets?

[英]Restarting a JavaScript websocket when the server restarts - why does this code restart multiple websockets?

我正在嘗試讓websocket 連接在被服務器關閉后自動重啟

當我在“http://127.0.0.1:5082/”的瀏覽器中打開頁面時,我的示例代碼有效。 websocket 計數器計數,顯示調試文本“消息”。

當我關閉服務器時,出現調試消息“關閉”,然后交替顯示“啟動/關閉”。

當我再次打開服務器時,有幾十個 websockets 正在運行,調試消息在“消息”和“關閉”之間快速變化

如何確保一次只有一個websocket 連接處於活動狀態?

最小示例,使用 Python 的 FastAPI 作為服務器:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Websocket test</title>
</head>
<body>

<div id="container">
    OK - wait for websocket
</div>
<hr noshade>
<div id="debug">
    Some debug text here
</div>

<script>

    var debug_container = document.getElementById("debug")
    debug_container.innerHTML = "Debug: Javascript is running"

    function my_websocket() {
        debug_container.innerHTML = "starting"
        var ws = new WebSocket("ws://localhost:5082/ws")

        ws.addEventListener('message', function (event) {
            debug_container.innerHTML = "message"
            var container = document.getElementById("container")
            container.innerHTML = event.data
        })
        ws.addEventListener('open', function (event) {
            debug_container.innerHTML = "open"
        })
        ws.addEventListener('close', function (event) {
            debug_container.innerHTML = "close";
            setInterval(my_websocket, 5000);
        })
        ws.addEventListener('error', function (event) {
            debug_container.innerHTML = "error"
        })
    }

    my_websocket()

</script>

</body>
</html>

websocket 由 Python FastAPI 服務器提供服務

import uvicorn
import websockets
from fastapi import FastAPI, WebSocket
from fastapi.responses import HTMLResponse
from pathlib import Path
import asyncio

app = FastAPI()


@app.get('/')
def index():
    return HTMLResponse(Path("index.html").read_text())


@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    cnt = 1
    while True:
        cnt += 1
        try:
            await websocket.send_text(f"{cnt}")
        except websockets.exceptions.ConnectionClosedOK:
            break
        await asyncio.sleep(0.25)

if __name__ == '__main__':
    uvicorn.run(app=app, host="0.0.0.0", port=5082)

客戶端之所以建立多個websocket連接,是由於以下代碼:

ws.addEventListener('close', function (event) {
    debug_container.innerHTML = "close";
    setInterval(my_websocket, 5000);
})

使用 setInterval 會導致它每 5 秒創建一個新的 websocket 連接。 我認為您打算改用 setTimeout() 。

暫無
暫無

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

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