У меня есть следующая система: [Clietn] --- [Веб-сервер (Flask)] --- [Источник данных].
Источник данных подключается к серверу и бесконечно отправляет новые данные , Сервер, получив новые данные, отправляет их клиенту. Обмен организован с использованием библиотеки Socket.IO.
[ Clietn (JS) socket.io)] --- [python - flask -socketio Сервер python - flask -socketio] --- [python -socketio Источник данных ]
Код
Клиент
window.onload = function() {
// var socket = io();
var socket = io.connect('http://' + document.domain + ':' + location.port + '/');
socket.on('connect', function() {
// Socket.IO подсоединен
let p = document.getElementById('connect_status');
p.innerHTML = 'Connect';
});
socket.on('disconnect', function(disconnectReason, errorMessage) {
// Socket.IO отсоединен
let p = document.getElementById('connect_status');
p.innerHTML = 'Disconnect';
});
socket.on('my_response', function(msg) {
console.log(msg);
});
};
Сервер (Flask)
...
socketio = SocketIO()
...
socketio.init_app(app, async_mode='gevent')
...
###############################################################################
# Client
###############################################################################
@sio.on('connect', namespace='/')
def on_connect():
print request.namespace
# global thread, client_count
# client_count += 1
# with thread_lock:
# if thread is None:
# thread = sio.start_background_task(background_thread)
print('Client {} connected'.format(request.sid))
@sio.on('disconnect', namespace='/')
def on_disconnect():
# global thread, client_count
# client_count -= 1
# if client_count == 0:
# thread.join()
# thread = None
print('Client {} disconnected'.format(request.sid))
@sio.on('tmp', namespace='/')
def on_tmp(data):
print data
sio.emit('my_response', {'data': 'Server generated event'}, namespace='/')
###############################################################################
# Connector
###############################################################################
@sio.on('tag_changed', namespace='/connector')
def on_tag_changed(data):
print("{2}: {0} = {1}".format(data['tagName'], data['tagVal'], data['tv_sec']))
sio.emit('my_response', {'data': data}) # inform customer
@sio.on('connect', namespace='/connector')
def on_connect_connector():
print('Client (connector) {} connected'.format(request.sid))
@sio.on('disconnect', namespace='/connector')
def on_connect_connector():
print('Client (connector) {} disconnect'.format(request.sid))
Источник данных Dara
import ctypes
import threading
import socketio
async_mode = 'gevent'
# sio = socketio.Server(async_mode=async_mode)
# app = socketio.WSGIApp(sio)
sio = socketio.Client()
thread = None
thread_lock = threading.Lock()
work = False
ktmIPC = ctypes.CDLL("./pe2.so")
ktmIPC.init_conn()
def background_thread():
class timeval(ctypes.Structure):
_fields_ = [("tv_sec", ctypes.c_long), ("tv_usec", ctypes.c_long)]
def on_tag_changed(tag_name, tag_val, tv):
sio.emit('tag_changed',
{'tagName': tag_name, 'tagVal': tag_val, 'tv_sec': tv.tv_sec},
namespace='/connector')
print("{2}: {0} = {1}".format(tag_name, tag_val, tv.tv_sec))
c_cb = ctypes.CFUNCTYPE(None, ctypes.c_char_p, ctypes.c_double, timeval)(on_tag_changed)
ktmIPC.set_tag_change_callback(c_cb)
while work:
ktmIPC.conn_proc()
sio.sleep(0.1)
@sio.on('connect', namespace='/connector')
def connect():
print 'Client {} connect.'.format(sio.sid)
global thread, work
work = True
with thread_lock:
if thread is None:
thread = sio.start_background_task(background_thread)
@sio.on('disconnect', namespace='/connector')
def disconnect():
global work
work = False
print 'Client {} disconnect'.format("sid")
if __name__ == '__main__':
print '\n---------- START CLIENT ----------\n'
sio.connect('http://192.168.3.58:5000', namespaces=['/connector'])
Почему при подключении соединителя к серверу "@ sio.on ( 'connect', namespace = '/') "обработчик срабатывает? Также активируется обработчик "@ sio.on ('tag_changed', namespace = '/ connector')".
sio.connect ('http://192.168.3.58:5000/connector', namespaces = ['/ connector'])
тоже не помогло.