Python не получает излучение от socketIO - PullRequest
0 голосов
/ 28 мая 2020

В настоящее время мы работаем над связью между сервером socketIO express, React и python скриптом. Мы отправляем emit from response при нажатии кнопки. Сервер express отвечает и обновляет состояние. Все работает нормально. У клиента реакции есть обработчик, который запускается onClick:

  const handleStartButton = () => {
    socket.emit("startGame", language);
  }

Эта часть работает, сервер отвечает на нее и выполняет функцию updateGameState на стороне сервера.

Сервер:

const express = require('express');
const path = require('path');
const logger = require('morgan');
const videos = require("./videos.json");
const defaults = require("../defaults.json");

const http = require("http")
const socketIO = require("socket.io")
const port = process.env.PORT || 3001; // process... is an environment variable used byheroku


const puzzleStateRouter = require('./routes/puzzle-state');
const keypadRouter = require('./routes/keypad.route');

const spawn = require("child_process").spawn;
const state = {gameState: defaults.game_state, videoState: defaults.video_state};

const server = express();
const app = http.createServer(server);

const io = socketIO(app);

server.use(logger('dev'));
server.use(express.json());
server.use(express.static(path.join(__dirname, '../../build')));
server.use(express.static(path.join(__dirname, '../../assets/videos')));

server.use('/puzzle-state', puzzleStateRouter);
server.use('/keypad', keypadRouter);

server.get('/game-state', (req, res) => {
    res.json(state.gameState)
});

server.get('/videos/:video', (req, res) => {
    const video = req.params["video"];

    res.sendFile(path.join(__dirname, "../../", videos[video]));
})

server.get('/video-state', (req, res) => {
    res.json(state.videoState)
});

server.get('/', (req, res) => res.sendFile(path.join(__dirname, '../../build', 'index.html')));


// updating state
const updateGameState = (newState) =>{
    state.gameState = newState;
}
exports.updateGameState = updateGameState;

const updateVideoState = (newState) =>{
    state.videoState = newState;
}
exports.updateVideoState = updateVideoState;

// listen if client requests a change of state
io.on("connection", socket => {

    socket.on("startGame", data => { //data is the selected language
        updateGameState("video") //always go to video if game is started
        console.log(data);
    });

    socket.on("updateGameState", data => {
        updateGameState(data)
    });

    socket.on("updateVideoState", data => {
        updateVideoState(data)
    });

    socket.on("reset", data => {
        updateGameState(defaults.game_state);
        updateVideoState(defaults.video_state);
        socket.emit("reset", "reset")
    });
});

app.listen(port, () => console.log(`Listening on port ${port}`));

Часть, где у нас возникла проблема, - python. Он не получает сообщение startGame от response. Особенность заключается в том, что когда мы генерируем сообщение из сценария python и отправляем другое излучение с сервера в пределах socket.on ("this_emit), сценарий python получает его. Почему это не работает? Все подключены к тот же порт и sio.sid также сообщает нам, что он подключен

from Program import run_program
from Sound import Sound
from Status import Status
import socketio
import time

sio = socketio.Client()
sio.connect('http://localhost:3001')

sounds = Sound("Dutch")
gameState = Status()


def status_update(data):
    gameState.update(data)


def start(data):
    sounds.load(data)
    gameState.reset()
    run_program(gameState, sounds)


def reset(data):
    gameState.reset()


while True:
    sio.on('startGame', start)
    # sio.on('reset', reset)
    # sio.on('updatePuzzleState', status_update)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...