Flask-SocketIO:Python代码可以发送,但不能接收。 JavaScript代码可以接收,但不能发送

问题描述 投票:0回答:1

我正在开发一款多人网页游戏,该游戏使用 Flask-SocketIO 在服务器和客户端之间进行实时通信。但是,我面临一个问题,Python 代码可以成功向客户端发送数据,但无法接收 JavaScript 代码的任何发射。另一方面,JavaScript 代码可以从服务器接收数据,但无法发回任何发射。

对于错误的代码或愚蠢的错误,我提前表示歉意,我是套接字新手,并不完全理解它们。

以下是问题摘要:

  • Python 代码使用 Flask-SocketIO 并包含“player_data”事件的事件处理程序。
  • JavaScript 代码使用 SocketIO 库,并包含“player_data”事件的事件处理程序。
  • 客户端成功连接到服务器,但是当 Python 代码发出“player_data”事件时,JavaScript 代码确实接收到它。
  • 但是,当 JavaScript 代码发出“player_data”事件时,Python 代码也不会收到该事件。

我尝试从我的 Flask 服务器和 JavaScript 来回发送实时玩家位置数据。套接字成功连接,初始用户数据发送到客户端,然后客户端尝试发送回数据,没有报告错误,但是我的Python代码中的socket.on()函数上的代码确实被执行了。

预期行为

  • Python 代码应该能够发出 JavaScript 客户端可以接收的“player_data”事件。
  • JavaScript 客户端应该能够发出 Python 代码可以接收的“player_data”事件。

实际行为

  • Python 代码发出“player_data”事件,JavaScript 客户端接收它们。
  • JavaScript 客户端发出“player_data”事件,但是Python 代码永远不会接收它们。没有明显的错误。

Javascript:

var players = {};
var socket = io('/game');

socket.on('connect', () => {
    console.log('Connected to server.');
});

socket.on('player_data', function(updatedPlayers) {
    console.log("Updated players data:");
    players = updatedPlayers;
    console.log(players);
});

var player_id = generateUserId(Object.keys(players));

function send_player_data(id, x, y) {
    console.log("Sending player data: " + id + " " + x + " " + y);
    socket.emit('player_data', {
        id: id,
        x: x,
        y: y
    });
}

send_player_data(id, x, y)

Javascript 输出:

8game.js:116 Sending player data: 737510 768 662
game.js:108 Updated players data:
game.js:110 {}
game.js:104 Connected to server.
171game.js:116 Sending player data: 737510 768 662

Python代码:

@app.route('/game', methods=['GET', 'POST'])
def game():
    return render_template('game.html')

socketio = SocketIO(app, max_http_buffer_size=1000000)

players = {}

@socketio.on('connect', namespace='/game')
def handle_connect():
    print('Client connected')
    emit('player_data', players)

@socketio.on('disconnect', namespace='/game')
def handle_disconnect():
    print('Client disconnected')

@socketio.on('player_data', namespace='/game')
def handle_player_data(data):
    print('Player state update:', data)
    
    player_id = data['id']
    player_x = data['x']
    player_y = data['y']
    active = True 

    players[player_id] = {"x": player_x, "y": player_y, "active": active}

    emit('player_data', players, broadcast=True)

Python 输出(这显然让我的控制台充满了重复,所以这里是一个片段):

INFO:werkzeug:127.0.0.1 - - [10/Mar/2024 02:41:20] "POST /socket.io/?EIO=4&transport=polling&t=OucF7WY&sid=ezy6IQ_nADGehX0LAAAC HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [10/Mar/2024 02:41:20] "POST /socket.io/?EIO=4&transport=polling&t=OucF7XQ&sid=ezy6IQ_nADGehX0LAAAC HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [10/Mar/2024 02:41:20] "POST /socket.io/?EIO=4&transport=polling&t=OucF7YI&sid=ezy6IQ_nADGehX0LAAAC HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [10/Mar/2024 02:41:20] "POST /socket.io/?EIO=4&transport=polling&t=OucF7ZA&sid=ezy6IQ_nADGehX0LAAAC HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [10/Mar/2024 02:41:20] "POST /socket.io/?EIO=4&transport=polling&t=OucF7a9&sid=ezy6IQ_nADGehX0LAAAC HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [10/Mar/2024 02:41:21] "POST /socket.io/?EIO=4&transport=polling&t=OucF7bb&sid=ezy6IQ_nADGehX0LAAAC HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [10/Mar/2024 02:41:21] "POST /socket.io/?EIO=4&transport=polling&t=OucF7eW&sid=ezy6IQ_nADGehX0LAAAC HTTP/1.1" 200 -
javascript python flask socket.io flask-socketio
1个回答
0
投票

简单的解决方案,代码是正确的,但是我在 github 代码空间上运行它,而不是将其推送到我的服务器。当我推送到服务器时问题就解决了。

© www.soinside.com 2019 - 2024. All rights reserved.