Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

Поднимаем веб-сервер с Tornado и слушаем его


Сегодня разберём как создать WebSocket средствами Python.
Для этого мы будем использовать веб-сервер tornado. Он позволит нам поднять свой вебсокет в один файл!

Создание сервера с WebSocket

Чтобы установить tornado, необходимо выполнить одну команду.

pip3 install tornado

Далее создадим файл, я его назвал web.py

Со следующим содержанием.

Давайте разберём код подробно.

Сначала импортируем следующие библиотеки.

import tornado.websocket  
import tornado.web  
import tornado.ioloop

Далее создадим класс, который унаследуем от tornado.websocket.WebSocketHandler

class EchoWebSocket(tornado.websocket.WebSocketHandler):

Затем объявим массив,в который мы будем складывать активных юзеров.

clients = []

Дадим права на обращение к нашему сокету. Здесь мы разрешаем абсолютно всем.

def check_origin(self, origin):  
    return True

После этого мы переопределим следующие методы. Это обязательно.

def open(self):  
    EchoWebSocket.clients.append(self)  
    self.write_message("WebSocket opened")  
  
def on_message(self, message):  
    for client in EchoWebSocket.clients:  
        client.write_message(u"You said: " \+ message)  
  
def on_close(self):  
    EchoWebSocket.clients.remove(self)  
    print("WebSocket closed")

Метод open срабатывает при подключение пользователя.

Добавим нового пользователя в наш массив.

EchoWebSocket.clients.append(self)  

on_message срабатывает, при получении сообщения от пользователей, и отправляет их всем.
А цикл поможет нам его отправить всем "слушателям":

for client in EchoWebSocket.clients:  
        client.write_message(u"You said: " \+ message) 

Последний метод сработает когда юзер отключится.

def on_close(self):  
    EchoWebSocket.clients.remove(self)  
    print("WebSocket closed")

Удаляет пользователя из массива.

EchoWebSocket.clients.remove(self) 

Реализация класса завершена. Давайте пропишем настройки сервера:

if __name__=='__main__':  
    app = tornado.web.Application([  
        (r"/", EchoWebSocket)  
    ])  
    app.listen(8881)  
    tornado.ioloop.IOLoop.instance().start()

Услвоие необходимо если Вы запускаете скрипт через консоль. Тогда Python запустит его содержимое.

if __name__=='__main__': 

Запишем наши "приложения" и пропишем по какому url можем к ним обращаться

app = tornado.web.Application([  
        (r"/", EchoWebSocket)  
    ]) 

Укажем порт

app.listen(8881)  

И запустим сервер:

tornado.ioloop.IOLoop.instance().start()

Создание клиента с WebSocket

Теперь нам нужны пользователи, которые будут "слушать" вебсервер по сокетам.
Сделать это можно на любом языке программирования, который поддерживает работу с websocket.
Для примера используем NodeJS

const WebSocket = require('ws');
const ws = new WebSocket('ws://server.domain:8881');

//слушаем сокеты и выводим сообщения
ws.on('message', function incoming(raw) {
    console.log(raw)
});

//отправляем данные веб-серверу
function SendMess(){
    ws.send('Hello')
}

//шлём сообщение серверу раз в 3 сек, тест
setInterval(SendMess, 3000);

Данную технологию можно использовать для создания чата, например, для мониторинга, для биржи и многого другого.

Код запущен и протестирован, если у вас что-то не работает - спрашивайте.
Документация по серверу
Материал подготовлен автором @zheev

142
34.278 GOLOS
На Golos с August 2017
Комментарии (3)
Сортировать по:
Сначала старые