Javascript 用python服务器替换Nodejs Socket.io服务器

Javascript 用python服务器替换Nodejs Socket.io服务器,javascript,python,socket.io,Javascript,Python,Socket.io,我一直在尝试用python3中的flask socketio服务器替换node.js socket.io服务器。然而,经过多次尝试,包括不同的方法都没有产生好的结果。有人能指出我哪里出错了吗 var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); io.on('connection', function(socket){ so

我一直在尝试用python3中的flask socketio服务器替换node.js socket.io服务器。然而,经过多次尝试,包括不同的方法都没有产生好的结果。有人能指出我哪里出错了吗

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

io.on('connection', function(socket){
    socket.on('event', function(msg){
        io.emit('event', msg);
        console.log(msg);
    });
});
http.listen(3000, function () {
    console.log('Socket.io Running');
});
我在python3中使用Flask socketio的尝试如下所示:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!' # is this the default or does this have no effect ?
socketio = SocketIO(app)

@socketio.on('connect')
def test_connect():
    print('Connected!! ')

@socketio.on('disconnect')
def test_connect():
    print('Disconnected!! ')

@socketio.on('message')
def test_connect():
    print('Msg came!! ')

@socketio.on('json')
def test_connect():
    print('JSON is here!! ')

@socketio.on('event')
def test_event(msg):
    print('In test_event function.')
    emit('event', msg)

if __name__ == '__main__':
    socketio.run(app, port = 3000)
node.js版本工作得非常好。 然而,对于python,我不能这么说

  • 连接和断开打印行确实出现
  • 但从未调用事件函数(或其中的打印函数)。消息和json事件都不会被调用
  • 客户端使用AngularJS并执行基本Socket.io事件发射
  • 删除“密钥”conifg无效。服务器连接和断开连接
客户端应该没有任何影响,因为node.js服务器工作得很好。但以防万一,一个人需要它,它就在这里

客户端代码:

function copy(data) {
    return JSON.parse(JSON.stringify(data));
}

function addUUID(data) {
    if (Array.isArray(data)) {
        return data.concat([UUID]);
    } else {
        var temp = copy(data);
        temp.UUID = UUID;
        return temp;
    }   
}
socket.emit('event', addUUID(data))

请检查图书馆创建者提供的官方文件, 您似乎缺少或正在传递字符串“数据”部分

摘自链接的一节

@socketio.on('my event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']})

在进一步的开发生命周期中使用如上所述的名称空间是很好的

因此,我能够使用python socketio()而不是Flask socketio在python中实现一个正常工作的socket.io服务器,因为某种原因,我仍然无法找到原因。无论如何,以下是实现:

import socketio
import eventlet
from flask import Flask, render_template

sio = socketio.Server()
app = Flask(__name__)

@sio.on('connect')
def connect(sid, environ):
    print('connect ', sid)

@sio.on('event')
def message(sid, data):
    print('msg ', data)

@sio.on('disconnect')
def disconnect(sid):
    print('disconnect ', sid)

if __name__ == '__main__':
    # wrap Flask application with socketio's middleware
    app = socketio.Middleware(sio, app)

    # deploy as an eventlet WSGI server
    eventlet.wsgi.server(eventlet.listen(('', 3000)), app)

您需要在Flask中安装
eventlet
gevent
,以使HTTP协议更改为
WebSocket
(状态101)

尝试:

pip安装gevent websocket


注意:我建议使用NodeJs而不是flaskforwebsockets,因为在python中部署到生产环境只使用一个线程(worker)。

我也尝试过这一点。但是,没有用。另外,打印行没有被执行,所以至少我认为这不是数据解析的问题。是否使用了名称空间选项?是的,我也使用了该选项。