Мой клиент довольно прост:
Код: Выделить всё
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);}
}
Сервер немного более сочный:
Код: Выделить всё
# 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)
Клиенты могут подключаться к серверу и отправлять данные, но неважно, что я пробовал, клиенты ничего не получат обратно. Я тщательно тестировал его в локальной сети, но ничего. Если я перестану отправлять запросы от клиента, он войдет в цикл отключения/подключения.
Код: Выделить всё
>>> 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