2016-12-07 151 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)