1

我之前问过这个关于 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 没有登录到客户端,并让它这样做。为什么会这样?

4

0 回答 0