Клиент может отправлять, но не получать. (сервер: Python Flask SocketIO) (клиент: socket.io.min.js)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Клиент может отправлять, но не получать. (сервер: Python Flask SocketIO) (клиент: socket.io.min.js)

Сообщение Anonymous »

У меня около 100 строк кода, требующих определенных знаний. Я работаю над классической структурой клиент-сервер, используя флягу и веб-сокеты. Связь от клиента к серверу работает нормально, но связь от сервера к клиенту не работает вообще.
Мой клиент довольно прост:

Код: Выделить всё

    var socket = io({
transports: ['websocket'],
pingInterval: 25000, // ping every 25 sec
pingTimeout: 10000   // timeout 10 sec
});

socket.on('connect', function ()
{
console.log('Connected')
socket.emit('pin:8989')

});

socket.on('update', function (data) {
print(data)
const json_data = JSON.parse(data);
Object.keys(json_data).forEach(key => {
const update = json_data[key];
if (update.key) document.getElementById(update.key).innerHTML = update.value;});});

function send(request) {
if (request) {
socket.emit('request', request);
console.log('Sent:', request);}
}
Он должен подключаться, получать и обрабатывать JSON, а также иметь возможность отправлять запросы.
Сервер немного более сочный:

Код: Выделить всё

# Interface Terminal
from threading import Thread, Event
from flask import Flask, request, render_template
from flask_socketio import SocketIO
from abc import abstractmethod
from system.error_handler import err_terminal
import datacore
import time

flask = Flask('undefined') # flask webserver (HTTP)
socket = SocketIO(flask, cors_allowed_origins="*") # flask socket io (TCP)

class Terminal():
def __init__(self, name, host, port, templates, statics):
self.core = datacore.Cores.TERMINAL
flask.terminal_instance = self  # store this instance in the app
flask.name = name  # application name
flask.template_folder = templates  # path to templates folder (index > .html)
flask.static_folder = statics      # path to static files folder (.js .css .png ...)
self.flask_thread = Thread(target=socket.run, args=(flask, host, port))
self.feeding_thread = Thread(target=self.feed)
self.stop_feeding = Event()             # event to signal stop feeding clients

#run app
def run(self):
try:
self.flask_thread.start()
self.feeding_thread.start()
except Exception as e:
err_terminal('Fail to run', e)

#stop app
def stop(self):
try:
self.stop_feeding.set()  # signal the feed task to stop
self.feeding_thread.join()
socket.stop()  # stop flask
except Exception as e:
err_terminal('Fail to stop', e)

# send data
def send(self, data, event='update'):
try:
socket.emit(event, data)  # send data to all connected clients
except Exception as e:
err_terminal('Fail to send', e)

# feed data (task: periodically emit to clients)
def feed(self):
while not self.stop_feeding.is_set():
package = {}                # empty package
self.on_packJSON(package)   # populate the package
self.send(package)          # send package
time.sleep(1)               # loop once a sec

# hooks for the subclass
@abstractmethod
def on_packJSON(self, package): pass    # hook to packing data
@abstractmethod
def on_receive(self, request): pass     # hook to incoming request (unpacking)
@abstractmethod
def on_connect(self, address): pass     # hook to client connection
@abstractmethod
def on_disconnect(self, address): pass  # hook to client disconnection

# flask handlers
@flask.route('/')           # render index.html
def index(): return render_template('index.html', title=flask.name)
@socket.on('request')       # incoming request
def receive(request): flask.terminal_instance.on_receive(request)
@socket.on('connect')       # client connection
def connect(): flask.terminal_instance.on_connect(request.remote_addr)
@socket.on('disconnect')    # client disconnection
def disconnect(): flask.terminal_instance.on_disconnect(request.remote_addr)
@socket.on('error')         # client error
def error(err): err_terminal('Client error', err)
Я использую Flask в качестве веб-сервера и сервера веб-сокетов. Class Terminal поддерживает два потока: первый запускает flask, а второй отправляет поток клиентам. Упаковка данных для отправки, распаковка полученных данных и мониторинг клиентов делегируются подклассу.
Клиенты могут подключаться к серверу и отправлять данные, но неважно, что я пробовал, клиенты ничего не получат обратно. Я тщательно тестировал его в локальной сети, но ничего. Если я перестану отправлять запросы от клиента, он войдет в цикл отключения/подключения.

Код: Выделить всё

>>> 05:22 192.168.158.127 connected
> 05:23 192.168.158.127 connected
> 05:23 192.168.158.127 connected
Я предполагаю, что это потому, что он ничего не получает от сервера, но я даже не уверен, что это связано (он ведет себя так даже без установки тайм-аута). Я пытался отслеживать клиент с помощью чего-то вроде этого, чтобы перехватить все возможные события:

Код: Выделить всё

socket.onAny((event, ...args) => {console.log(event,args);});
Но он даже не улавливает «подключение». Я чувствую, что проблема может заключаться в том, как я обрабатываю события для обработки входящих данных, поскольку другой канал (клиент-сервер) работает отлично, но это также может быть моя настройка.
Ладно, у меня закончились патроны для этого. Есть ли какие-нибудь хорошие идеи или предложения, которые помогут вернуться к решению этой проблемы?
[ОБНОВЛЕНИЕ] Я написал небольшой клиент на Python для тестирования сервера. Те же результаты. Итак, я попытался написать еще один сервер, используя собственные веб-сокеты, а не flask, и... ну, вы правильно догадались. =(
Итак, видимо дело не в клиенте. Что-то блокирует сообщения от моих хостов. Я немного поигрался с переадресацией портов, но ничего.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ent-socket
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»