![](/img/trans.png)
[英]Sending data from the Python TCP Socket(as server) to the JS client
[英]Continuously sending data from Python Flask server to client through Websockets
我正在設置一個儀表板,它需要一個 Python Flask 服務器每隔幾秒左右獲取一次公共交通數據,並通過 websockets 將此數據發送到客戶端網頁。 我正在使用 FlaskSocketIO 來實現這一點。
例如,我可以在'connect'
事件時發送消息,但我一直無法找到一種方法來持續更新此消息。 這是我的方法:
from flask import Flask, render_template, url_for, request
from flask_socketio import SocketIO, emit, send
import eventlet
eventlet.monkey_patch()
app = Flask(__name__)
socketio = SocketIO(app, logger=True, engineio_logger=True)
def listen():
while True:
message = # some updating message
emit('message', message)
socketio.sleep(1)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('connect')
def handle_connect():
listen()
if __name__ == "__main__":
socketio.run(app, debug=True)
記錄器說它發送了消息。 但是,在客戶端,沒有收到任何消息。 客戶端 JavaScript 是:
var socket = io();
socket.on('message', function(msg) {
console.log(msg);
});
我和你有同樣的問題,在我的情況下,我想更新傳感器儀表板,所以我研究了觀察者模式,這個鏈接是非常好的觀察者模式。實現一個 SocketEmitObservator,使用你不需要創建監聽器的觀察者(無限時)循環)並使您的代碼更干凈:
class SensorObserver(Observer):
sensor_id: int
sid = ''
def __init__(self, sid,sensor_id=None):
Observer.__init__(self)
self.sensor_id = sensor_id
self.sid = sid
SensorPublisher().attach(self)
def update(self, sensorData: DataModel) -> None:
socket.emit("info",
{'sensor': subject},
namespace='/api/sector/machine',
room=self.sid)
def __del__(self):
SensorPublisher().detach(self)
class SensorPublisher(Subject, Singleton):
_observers: List[SensorObserver] = []
_sensorData: Dict[str, DataModel] = {}
def attach(self, observer: SensorObserver) -> None:
if observer not in self._observers:
self._observers.append(observer)
def notify(self, sensorModel: DataModel) -> None:
for observer in self._observers:
if sensorModel.sensor_id == observer.sensor_id:
observer.update(sensorModel)
def detach(self, observer: SensorObserver) -> None:
if observer in self._observers:
ob = self._observers.pop(self._observers.index(observer))
del ob
def update(self, sensorModel: DataModel):
sendorId: str = str(sensorModel.sensor_id)
self._sensorData[sendorId] = sensorModel
self.notify(sensorModel)
#### And in the place where i update sensor data i put
SensorPublisher().update(dataStructList)
#### To create a observr just do
@socketio.on('connect')
def handle_connect():
SensorObserver(self.sid, item)
在我的情況下,我是這樣使用的,但您可以適應您的問題
您不能在連接處理程序中添加while True
循環,因為這會阻止連接處理程序返回並建立連接。
您可以將此作為對建立連接后客戶端發送的另一個事件的響應,或者您也可以啟動一個實現此循環的后台任務。 連接處理程序需要快速返回以允許連接發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.