Обратный вызов Python для сокета-клиента не получает аргументы - PullRequest
0 голосов
/ 02 июля 2019

Отправляю команду на флеш-сервер (файлы). Он отвечает, испуская ответ, в качестве аргумента, dict предоставляется с запрошенными именами файлов.

from socketIO_client import SocketIO, LoggingNamespace, BaseNamespace


def on_data_command_response(*args):
    print('on_data_command_response')
    print(len(args))
    print("-----------")


with SocketIO("192.168.1.164", 5000, LoggingNamespace) as socketIO:

    socketIO.on('data command response', on_data_command_response)

    socketIO.emit('data event', {'command': 'files'}, on_data_command_response)
    socketIO.emit('data event', {'command': 'files'}, on_data_command_response)

    socketIO.wait_for_callbacks(seconds=5)

В колбе команда получена как:

@socketio.on('data event')
def data_event(json, methods=['GET', 'POST']):
    print('received data command: {}'.format(json))

и ответ отправлен:

def emit_data_command_response(payload_json):
    socketio.emit('data command response', payload_json, callback=messageReceived)

Вопрос: Похоже, что излучение было получено два раза. Один раз с аргументами и один раз без каждой команды, которую я послал.

on_data_command_response
2
-----------
on_data_command_response
0
-----------
on_data_command_response
2
-----------
on_data_command_response
0
-----------

ВАРИАЦИЯ 1:

socketIO.on('data command response', on_data_command_response)


socketIO.emit('data event', {'command': 'files'}, on_data_command_response)
socketIO.emit('data event', {'command': 'files'})
socketIO.emit('data event', {'command': 'files'})
socketIO.emit('data event', {'command': 'files'})

возвращает

on_data_command_response
2
-----------
on_data_command_response
0
-----------
on_data_command_response
2
-----------
on_data_command_response
2
-----------
on_data_command_response
2
-----------

но VARIATION 2 (который мне показался наиболее логичным):

socketIO.on('data command response', on_data_command_response)
socketIO.emit('data event', {'command': 'files'})

on_data_command_response даже не вызывается.

Я не понимаю, что я делаю здесь неправильно. Любая помощь, чтобы получить обратный вызов "on_data_command_response", вызываемый один раз с аргументами?

1 Ответ

0 голосов
/ 03 июля 2019

Проблема в том, что я перепутал callback и emit. -> обратный вызов - это когда сервер «возвращает» команду emit. -> socketIO.on .... руководит, когда сервер сделал emit. socketIO.wait (seconds = 1) -> ожидает обратных вызовов. Так что, если функции обратного вызова не предоставлены, это ничего не делает.

https://pypi.org/project/socketIO-client/

Клиент:

import time
from socketIO_client import SocketIO, LoggingNamespace, BaseNamespace


def on_data_command_response(*args):
    if len(args) > 0:
        print(len(args))
        # print('on_data_command_response')
        # for arg in args[0]:
           # print((arg)) 
    else:
        print("no args received.")
    # return # send acknowledgement

def message_received_by_servercallback(*args):
    print("----all good----")

def on_disconnect():
    print("lode disconnect")



with SocketIO("192.168.1.164", 5000, LoggingNamespace) as socketIO:

    socketIO.on('disconnect', on_disconnect)

    socketIO.on('data command response', on_data_command_response)

    socketIO.emit('backend event', {'command': 'files'}, message_received_by_servercallback)

    socketIO.wait_for_callbacks(seconds=1)

с сервером:

@socketio.on('backend event')
def backend_request(json):
    if "command" in json.keys():  
        if json["command"] == "files":
            response_json = {}
            response_json["status"] = "download files"

    payload_json = response_json
    socketio.emit('data command response', payload_json, callback=messageReceived)
    return ["received"] # will trigger the callback

работает как положено (клиентский терминал):

2
----all good----
lode disconnect
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...