Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用WebSockets扩展flaskrestapi_Flask_Flask Socketio_Flask Restplus - Fatal编程技术网

用WebSockets扩展flaskrestapi

用WebSockets扩展flaskrestapi,flask,flask-socketio,flask-restplus,Flask,Flask Socketio,Flask Restplus,我目前正在扩展使用Flask RESTPlus创建的现有REST API,并支持WebSocket。其想法是创建一个兼容的Web对象(网关)。我的用例中的“东西”是动态添加或删除的 当前设置允许消费者使用HTTP GET请求从物品(如温度传感器)获取最新值,请求/thingId/properties/temperature。这些值实际上是从卡夫卡消费的,并临时存储在Redis中 现在我想知道如何扩展这个设置,让消费者不仅可以轮询最新的值,还可以使用WebSocket订阅某个东西的属性。我有一个可

我目前正在扩展使用Flask RESTPlus创建的现有REST API,并支持WebSocket。其想法是创建一个兼容的Web对象(网关)。我的用例中的“东西”是动态添加或删除的

当前设置允许消费者使用HTTP GET请求从物品(如温度传感器)获取最新值,请求/thingId/properties/temperature。这些值实际上是从卡夫卡消费的,并临时存储在Redis中

现在我想知道如何扩展这个设置,让消费者不仅可以轮询最新的值,还可以使用WebSocket订阅某个东西的属性。我有一个可行的解决方案,为每个属性创建“房间”,但这需要两个独立的服务器和重复的端点

我休息一下

@app.route('/<thingId>/properties/<propertyId>')
    # get latest datapoint
    return latestDatapoint
@socketio.on('join')
def on_join(data):
    username = data['username']
    room = data['room'] # e.g. /thingId/properties/temperature
    join_room(room)
    send(username + ' has entered the room.', room=room)
然后我将数据转发到正确的房间,因为它来自卡夫卡。 在客户端,我需要连接到WebSocket服务器并加入房间

socket.on('connection', function(socket){
  socket.emit('join', 'some room');
});
这个实现是可行的,但我强烈希望有一个替代工作流,如下图所示,其中客户端连接到RESTAPI中使用的相同端点,但使用WebSocket协议,而不是加入文件室等。

您是否知道这是否已经存在或可以实施

我有一个可行的解决方案,为每个属性创建“房间”,但这需要两个独立的服务器和重复的端点

Socket.IO服务器和HTTP服务器不一定需要分开,在所有受支持的配置中,您可以使用单个服务器托管HTTP和Socket.IO应用程序

我也没有看到端点重复,但这可能是因为您认为Socket.IO事件处理程序是端点,而事实上它们不是。对于Socket.IO,HTTP意义上只有一个端点,因为所有Socket.IO通信都在一个URL上传输。事件处理程序就是这样的函数,当Socket.IO端点上出现某些事件时调用这些函数

客户端连接到RESTAPI中使用的相同端点,但使用WebSocket协议,而不是加入房间等

所以,您希望您的客户机为它想要观看的每件事情建立一个单独的WebSocket连接?这似乎有点资源密集,对我来说不是很容易扩展。如果客户端需要观看100件事情,那么它必须维护100个WebSocket连接。请记住,大多数浏览器都会限制一次可以打开的WebSocket连接的数量,无论是每页还是全局

IO是构建在WebSocket和HTTP之上的更高级协议。如果您仍然喜欢直接使用WebSocket,那么您可以使用任何可用的开源WebSocket服务器来实现应用程序,而不是使用Socket.IO。下面是我脑海中关于Python的几个选项:

  • (异步)
  • (异步)
您将失去Socket.IO提供的一些非常方便的功能:

  • 自动重新连接
  • 通过长轮询自动支持非WebSocket客户端
  • 基于事件的调度
  • 房间

因此,您需要确保这些功能并不重要,或者您可以直接在WebSocket服务器上实现它们。

嗨,米格尔。谢谢你的回答:)我的问题的灵感来自多米尼克·古纳德(Dominique Guinard)和弗拉德·特里法(Vlad Trifa)的《构建物联网》(Building The Web of Things)。它包括一个相当模块化的应用程序的Node.JS片段。它有多个包含传感器值的传感器插件(如DHT)。使用REST端点,您可以简单地轮询最新的值,但通过在url(端点)上打开WebSocket连接,您可以升级在传感器属性上注册观察者的协议,传感器属性将在udpated时连续发送值。这确实会为每个观察到的属性建立连接。。与使用更高级别的协议(如Socket.IO)相比,我将进一步研究尝试设置类似的协议的利弊。我目前正在研究gevent websocket与Flask()的结合,正如我在回答中所说的,打开多个websocket连接是浪费的,并且您有可能达到浏览器的最大连接限制。单个websocket连接(Socket.IO或not)有足够的带宽来处理所有您关注的内容。