烧瓶中的Socket.io:来自外部源的数据

时间:2017-08-10 11:42:34

标签: python django sockets flask flask-socketio

我有一个Web应用程序,需要在浏览器的后端连续显示正在进行的操作。我一直在尝试在Flask中使用socket.io。但我需要从我的项目中的其他Python模块中获取数据。因此,我尝试在Flask和外部模块之间建立套接字连接,我将从中获取数据以便在浏览器上显示(没有任何延迟)。

@socketio.on('my event')
def server(message):
    s = socket.socket()       
    print "Socket successfully created"
    port = 12345               
    s.bind(('', port))        
    print "socket binded to %s" %(port)
    s.listen(5)     
    print "socket is listening"           
    while True:
        c, addr = s.accept()     
        print 'Got connection from', addr
        print c.recv(1024)
        emit('my response', {'data': c.recv(1024)})
        c.close()

print c.recv(1024)正在控制台上打印数据。但是相同的数据没有反映在浏览器上。它抛出了这个错误 -

  

错误:[Errno 98]地址已在使用中

这意味着它在emit之后print c.recv(1024)失败了。怎么可能出错? 我首先怀疑是否允许这种联系。我的意思是,我们可以在Flask中的socket.io中创建套接字连接吗? 否则,使用Flask连续在浏览器上显示后端操作的最佳解决方案是什么?我还有Django的Web应用程序。任何解决我的Flask或Django用例的解决方案都将受到赞赏(最好是Django)。

1 个答案:

答案 0 :(得分:2)

问题是每次客户端将名为my event的事件发送到您的服务器时,您将尝试在端口12345上启动一个新的套接字服务器。显然这只是第一次工作。

您是否在文档中看到了Emitting from an External Process部分?

我们的想法是,您可以从任何辅助流程向客户端发出事件,这正是您所需要的。解决方案涉及安装消息队列(Redis,RabbitMQ),Flask-SocketIO服务器和需要具有发射功率的外部进程连接到该消息队列。