У меня есть простой вариант использования. Считайте некоторые данные с датчика и передайте их клиентам.
Поэтому я выбираю webSocket, но моя проблема в том, что мне нужно использовать какой-то таймер или триггер"чтобы сервер отправил данные.Прямо сейчас у меня есть файл .py, который подключается к веб-сокету и отправляет сообщения «ping», я могу переместить этот таймер в javascript и заставить клиентов отправлять сообщения «ping», которые будут лучше, но все еще с использованием таймера.
Мне нужен сервер для непрерывной потоковой передачи данных всем, кто подключен.
Сервер должен выглядеть примерно так:
Клиент- ПриветWS-сервер, к которому я хочу подключиться.
Sv - Круто, что вы находитесь.
Клиент - Спасибо за принятие ....
Сервер - Здесь есть некоторый бесконечный поток данных
Я думал, что это может сработать, так это то, что каждый клиент отправляет свой собственный «идентификатор» такчто сервер получает сообщение с идентификатором клиента, который хочет получить самые последние данные, и предоставляет ему самые последние данные, а на стороне клиента, каждый раз, когда он получает обновление, он снова отправляет другое сообщение для обновления и повторяется, пока один из них не сдается,вместо отправки данных всем клиентам вцикл.
Таймер ушел, но я думаю, что должно быть что-то лучше, потому что, глядя на консоль разработчика на некоторых веб-сайтах, которые используют веб-сокеты, я не вижу ничего, что отправлял с клиента только сервер.
Разве серверу не нужно событие для запуска сообщения или есть способ заставить сервер передавать данные?
Похоже, что веб-сокеты управляются событиями, но тогда как видео отправляются в реальном времени?через websockets? Обновляет ли клиент запрос?
Это сервер ws, который у меня есть в python, и вы можете увидеть "ping" в on_message ()
Мне не нужен реальный код илиреализации, просто, как люди это делают?
PORT = 9000
clients = []
class MainHandler(tornado.web.RequestHandler):
def get(self):
print("[HTTP](MainHandler) User Connected.")
self.render("index.html")
class WSHandler(tornado.websocket.WebSocketHandler):
def open(self):
clients.append(self)
print('[WS] Connection was opened.%s' % (self))
def on_message(self, message):
print('[WS] Incoming message: %s' % (message))
if message == "ping":
date = datetime.now().strftime('%H:%M:%S')
values = [0]*8
for i in range(8):
values[i] = random.uniform(1.5,1.9)
#decomentati
#values[i] = mcp.read_adc(i)* 3.3 /1023
#conversia se face in javscript trebuie inmulti cu referinta si impartit la 1023
message = {
'date': date,
'voltage': values
}
for client in clients:
client.write_message(json_encode(message))
def on_close(self):
clients.remove(self)
print('[WS] Connection was closed.')
application = tornado.web.Application([
(r'/', MainHandler),
(r'/ping', WSHandler),
(r'/ws', WSHandler),
], **settings)
if __name__ == "__main__":
try:
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(PORT)
main_loop = tornado.ioloop.IOLoop.instance()
print("Tornado Server started")
main_loop.start()
except:
print("Exception triggered - Tornado Server stopped.")
# GPIO.cleanup()
#End of Program