javascript - 用 python 服务器替换 Nodejs 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){
    socket.on('event', function(msg){
        io.emit('event', msg);
        console.log(msg);
    });
});
http.listen(3000, function () {
    console.log('Socket.io Running');
});

我在 python3 中尝试使用 Flask-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 版本完美运行。 但是,我不能对 python 说同样的话。

  • 确实会出现连接和断开打印行。
  • 但是永远不会调用事件函数(或其中的打印函数)。既不调用消息也不调用 json 事件。
  • 客户端使用 AngularJS 并发出基本的 Socket.io 事件。
  • 删除“SECRET_KEY”配置无效。服务器会连接和断开连接。

客户端应该没有任何影响,因为 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))

最佳答案

因此,由于某种原因我仍然无法找出原因,因此我能够使用 python-socketio ( docs ) 而不是 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)

关于javascript - 用 python 服务器替换 Nodejs Socket.io 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41011823/

相关文章:

javascript - 将元素动画到另一个元素的位置

javascript - jquery show 依次隐藏多个div

javascript - jquery next() 在 div 之外

python - 如何在网页中连续显示python输出?

node.js - Nodejs Winston 发送到套接字

java - 是否可以同时读取和写入 java.net.Socket?

javascript - AngularJs 和 SocketIo

javascript - 必须在 Backbone.js 中指定 'url' 属性或函数错误

java - 在什么情况下网络爬虫可能会受到 CPU 限制而不是 IO 限制?

Python 返回第一个输入的偶数/奇数