我之前问过这个关于 sanic 中的 websockets 的问题。这是一个跟进。
下面建立一个 websocket 连接,并console.log()
准确地发送一次“数据”消息:
from sanic import Sanic, response
from sanic.websocket import WebSocketProtocol
import asyncio
import time
app = Sanic()
@app.websocket('/feed')
async def feed(request, ws):
while True:
now = time.time()
data = 'messsage'
print(data)
await ws.send(data)
await asyncio.sleep(1)
@app.route('/')
async def handle_request(request):
return response.html("""
<html><head>
<script>
const ws = new WebSocket("ws://" + location.host + '/feed');
ws.onmessage = event => {
console.log(event.data);
}
</script>
</head>
<body><h1>Main</h1></body>
</html>
""")
app.run(host="0.0.0.0", port=8000)
在服务器端,“消息”是printed
周期性的。但在客户端,这console.logged
只是一次。
服务器:
客户:
我不清楚为什么它只打印一次,而不是像服务器端那样每秒打印一次。
但是,这里有两个条件 /do/ 使它每秒打印一次。
首先,console.log(event)
,然后console.log(event.data)
定期正确记录。
@app.route('/')
async def handle_request(request):
return response.html("""
<html><head>
<script>
const ws = new WebSocket("ws://" + location.host + '/feed');
ws.onmessage = event => {
console.log(event); // THIS IS THE ONLY CHANGE
console.log(event.data);
}
</script>
</head>
<body><h1>Main</h1></body>
</html>
""")
这会在客户端打印:
其次,我可以将javascript保持原样,
ws.onmessage = event => {
console.log(event.data);
}
但使用以下消息,每次都会更改:
@app.websocket('/feed')
async def feed(request, ws):
while True:
now = time.time()
data = f'messsage: {now}' # THIS IS THE ONLY CHANGE
print(data)
await ws.send(data)
await asyncio.sleep(1)
在服务器端打印:
messsage: 1565664622.570395
messsage: 1565664623.572094
messsage: 1565664624.5735717
messsage: 1565664625.5754132
messsage: 1565664626.5771558
messsage: 1565664627.5785906
这在客户端:
所以,这两个看似不相关的事情把我的 websocket 没有登录到客户端,并让它这样做。为什么会这样?