python Socket.IO klient do wysyłania wiadomości rozgłoszeniowych na serwer TornadIO2
Buduję aplikację internetową w czasie rzeczywistym.Chcę móc wysyłać wiadomości rozgłoszeniowe z implementacji mojej aplikacji Pythona po stronie serwera.
Oto konfiguracja:
socketio.js po stronie klientaTornadIO2 serwer jako serwer Socket.IOpyton po stronie serwera (Django struktura)Mogę z powodzeniem wysyłać wiadomości socket.io z klienta do serwera. Serwer obsługuje je i może wysłać odpowiedź. Poniżej opiszę, jak to zrobiłem.
Aktualna konfiguracja i kodPo pierwsze, musimy zdefiniować połączenie, które obsługuje zdarzenia socket.io:
class BaseConnection(tornadio2.SocketConnection):
def on_message(self, message):
pass
# will be run if client uses socket.emit('connect', username)
@event
def connect(self, username):
# send answer to client which will be handled by socket.on('log', function)
self.emit('log', 'hello ' + username)
Uruchomienie serwera odbywa się za pomocą niestandardowej metody zarządzania Django:
class Command(BaseCommand):
args = ''
help = 'Starts the TornadIO2 server for handling socket.io connections'
def handle(self, *args, **kwargs):
autoreload.main(self.run, args, kwargs)
def run(self, *args, **kwargs):
port = settings.SOCKETIO_PORT
router = tornadio2.TornadioRouter(BaseConnection)
application = tornado.web.Application(
router.urls,
socket_io_port = port
)
print 'Starting socket.io server on port %s' % port
server = SocketServer(application)
Bardzo dobrze, serwer działa teraz. Dodajmy kod klienta:
<script type="text/javascript">
var sio = io.connect('localhost:9000');
sio.on('connect', function(data) {
console.log('connected');
sio.emit('connect', '{{ user.username }}');
});
sio.on('log', function(data) {
console.log("log: " + data);
});
</script>
Oczywiście,{{ user.username }}
zostanie zastąpiona nazwą użytkownika aktualnie zalogowanego użytkownika, w tym przykładzie nazwa użytkownika to „alp”.
Teraz za każdym razem, gdy strona jest odświeżana, dane wyjściowe konsoli to:
connected
log: hello alp
Dlatego wywoływanie wiadomości i wysyłanie odpowiedzi działa.Ale teraz przychodzi trudna część.
ProblemyOdpowiedź „hello alp” jest wysyłana tylko do wywołującego komunikat socket.io. Chcę wysłać wiadomość do wszystkich podłączonych klientów, aby mogli być informowani w czasie rzeczywistym, jeśli nowy użytkownik dołączy do imprezy (na przykład w aplikacji do czatu).
Oto moje pytania:
Jak mogę wysłać wiadomość rozgłoszeniową do wszystkich podłączonych klientów?
Jak mogę wysłać wiadomość rozgłoszeniową do wielu podłączonych klientów, którzy są subskrybowani na określonym kanale?
Jak mogę wysłać wiadomość rozgłoszeniową w dowolnym miejscu mojego kodu Pythona (pozaBaseConnection
klasa)? Czy wymagałoby to pewnego rodzaju klienta Socket.IO dla Pythona lub czy jest on wbudowany w TornadIO2?
Wszystkie te transmisje powinny być wykonywane w niezawodny sposób, więc sądzę, że najlepszym wyborem są gniazda internetowe. Ale jestem otwarty na wszystkie dobre rozwiązania.