2016-12-07 153 views
1

我一直在尝试用python3中的flask-socketio服务器替换node.js socket.io服务器。然而,包括不同方法在内的多次尝试都没有产生好的结果。有人能指出我要出错的地方吗?用python服务器替换Nodejs 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使用烧瓶socketio并参照尝试它的docs是在这里下面:

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的版本完美的作品。 但是,我不能说蟒蛇一样。

  • 连接&断开打印线确实发生。
  • 但事件函数(或其中的打印函数)永远不会被调用。消息和json事件都不会被调用。
  • 客户端使用AngularJS并发出基本的Socket.io事件。
  • 删除'SECRET_KEY'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)) 

回答

0

请查看官方文档here,其通过库的创建者, 看来你是丢失或传递字符串“数据”部分

的剖面从链接

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

这是很好的使用命名空间如上进一步开发周期

+0

我也试过这个。然而,无济于事。此外,打印行没有执行,所以至少我认为这不是一个数据解析的问题。 –

+0

用过的命名空间选项? –

+0

是的,我也使用了这个选项。 –

2

因此,我能够在python中使用python-socketio(docs)代替Flask-SocketIO来实现一个可用的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)