如何解决服务器重新启动时重新启动JavaScript Websocket-为什么此代码重新启动多个Websocket?
我正在尝试建立网络套接字连接,以便在服务器关闭后自动自动重启。
当我在“ http://127.0.0.1:5082/”的浏览器中打开页面时,我的示例代码有效。 websocket计数器开始计数,显示调试文本“ message”。
当我关闭服务器电源时,将显示调试消息“关闭”,然后交替显示“启动/关闭”。
当我再次打开服务器电源时,有数十个Websocket正在运行,并且调试消息在“消息”和“关闭”之间快速变化
如何确保一次一个 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()。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。