Неопознанная причина дублирования сообщений, полученных через веб-сокет - PullRequest
2 голосов
/ 14 октября 2019

У меня проблема с обменом информацией между двумя машинами с помощью библиотеки socket.io.

Когда я использую оба сервера в библиотеке node.js и socket.io, я могу получить один ответ на каждое событие.

Подход Node.js

Главный сервер

const http = require('http'),
io = require('socket.io');

const server = http.createServer()

server.listen(3000);
io = io.listen(server); 

console.log('=== Main Server ===')
// Add a connect listener
io.sockets.on('connection', function(socket)
{
  console.log('Camera Server connected to Main Machine');

  socket.on('image', function (data) {

    let image = data[0]
    console.log('Camera Server sends data with ID:', data[1], typeof(image));
    let ID = data[1]

    socket.emit('response', "Main Server says: Camera Server thanks for data with ID:" + ID++);
    });

  socket.on('disconnect', function() {
  console.log('Camera Server disconnected.');
  });
});

Клиентский сервер

var io = require('socket.io-client');

const socket = io.connect('http://192.168.1.16:3000/', {
    reconnection: true
});

const wCap = new cv.VideoCapture(0);
wCap.set(cv.CAP_PROP_FRAME_WIDTH, 500);
wCap.set(cv.CAP_PROP_FRAME_HEIGHT, 400);

console.log('=== Camera Server ===')
let counter = 0


socket.on('connect', function () {

    console.log('Connection with Main Machine performed');

    setInterval(() => {
        socket.emit('image', counter++)
    }, 1500);

    socket.on('response', function (data) {
        console.log(data);
    });

    socket.on('disconnect', function() {
        console.log('Connection with Main Server was ended.');
    });
});

Вывод терминалов для подхода к узлу

https://i.imgur.com/neuhgfp.png

НО,

У меня естьзаменить мой главный сервер аналогичным сервером Flask. Для этого я получил этот код:

Главный сервер Flask - eventlet

from flask import Flask
from flask_socketio import SocketIO, emit, send
from random import randint
from flask_cors import cross_origin

app = Flask(_name_)
socketio = SocketIO(app, cors_allowed_origins="*")

@app.route('/')
def index():
    return render_template('index.html')


def message_received(methods=['GET', 'POST']):
    print('Message received!')

@socketio.on('image')
def test_message(data):
    print('Message received.', data)
    emit('response', data + 1, callback=message_received)

    print(response)


@socketio.on('connect')
def test_connect():
    print('Connected')
    emit('response', {'data': 'Connected'})

@socketio.on('disconnect')
def test_disconnect():
    print('Client disconnected')

if _name_ == "_main_":
    print('Works')
    socketio.run(app, host='192.168.1.16', port=3000)

Проблема этого решения заключается в том, что соединение между этими двумя серверами занимает много времени - гораздо больше, чемв однородном решении Node.js, а также, что является самым важным на стороне Node-Client, я получаю дублированные ответы. Существует также много проблем с созданием и поддержанием соединений - нам приходится много раз перезапускать серверы, чтобы выполнить всего один тест.

Вывод терминалов для 1. Flask / 2. Подход узла

  1. https://i.imgur.com/Rg190R7.png
  2. https://i.imgur.com/GvWIpZy.png

В чем причина этой проблемы и как ее решить?

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