Как отправить сообщение с сервера Python на клиент Javascript в Python-Socketio? - PullRequest
0 голосов
/ 13 октября 2018

Клиент socketio успешно подключается к серверу и отправляет сообщения с emit на сервер, но сервер другого направления клиенту не удается.Я не могу найти источник ошибки.Это

Вот серверный питон в app.py на основе примера на python-socketio веб-сайте:

from aiohttp import web
import socketio

sio = socketio.AsyncServer()
app = web.Application()
sio.attach(app)

async def index(request):
    """Serve the client-side application."""
    with open('index.html') as f:
        return web.Response(text=f.read(), content_type='text/html')

@sio.on('connect', namespace='/chat')
def connect(sid, environ):
    print("connect", sid)

@sio.on('chat message', namespace='/chat')
async def message(sid, data):
    print("server received message!", data)
    await sio.emit('reply', data)
    await sio.send(data)

@sio.on('disconnect', namespace='/chat')
def disconnect(sid):
    print('disconnect', sid)

app.router.add_static('/static', 'static')
app.router.add_get('/', index)

if __name__ == '__main__':
    web.run_app(app)

Я попытался прокомментировать один из await sio.emit('reply', data)или await sio.send(data) но результат был тот же.Вот клиент javascript в index.html:

<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.min.js"></script>
  </head>
  <body>
    <form id="the_form">
      <input type="input" name="msg" id="msg"></input>
      <input type="submit" value="➤"></input>
    </form>
    <script>
      var socket = io('http://localhost:8080/chat');

      socket.on('connect', function(){console.log('connect!')});
      socket.on('message', function(msg){console.log('message!', msg)});
      socket.on('disconnect', function(){console.log('disconnect!')});
      socket.on('reply', function(msg){console.log('reply!', msg)});

      document.getElementById('the_form').onsubmit = function(e) {
        let msg = document.getElementById('msg').value;
        document.getElementById('msg').value = '';

        // send it to the server
        socket.emit('chat message', msg);

        return false
      };
    </script>
  </body>
</html>

В окне терминала я запускаю сервер.Затем я открываю два окна браузера (Chrome версии 69.0.3497.100 (официальная сборка) (64-разрядная версия)) и отправляю «тест» из одного из них.Вот что я вижу в каждом окне:

Терминал

$ python3 app.py 
======== Running on http://0.0.0.0:8080 ========
(Press CTRL+C to quit)
connect 9b18034f7b8b4d4c857dec394ef01429
connect 3adea48a3e00459f807855da0337599c
server received message! test

Окно 1 (журнал консоли)

connect!

Окно 2 (журнал консоли)

connect!

1 Ответ

0 голосов
/ 13 октября 2018

На основании примеров здесь , предложенных в комментариях evgeni-fotia , аргумент пространства имен необходим здесь.Кажется, что пространство имен по умолчанию, по крайней мере в этой версии, не является пространством имен асинхронной функции.Итак, правильный способ трансляции с эхо-сообщением следующий:

@sio.on('chat message', namespace='/chat')
async def message(sid, data):
    print("server received message!", data)
    await sio.emit('reply', data, namespace='/chat')
...