如何在类中实现 websocket?

Posted

技术标签:

【中文标题】如何在类中实现 websocket?【英文标题】:How to implement websocket inside a class? 【发布时间】:2018-07-03 15:49:09 【问题描述】:

我正在尝试在一个类中使用 websocket.WebSocketApp,以便以后可以使用从 websocket 检索到的数据:

import requests
from urlparse import (urlparse, parse_qs)
import json
import websocket

class NeuroStream:

    def __init__(self, sensor, token):
    self._sensor = sensor
    self.token = token
    self.buf = []
    return

    def stream(self):
        self.ws = websocket.WebSocketApp(
            "wss://api.foofoo.com/api/v1/features/" + self._sensor
            + "/real-time/?all=true&access_token=" + self.token,
            on_message=self.on_message,
            on_error=self.on_error,
            on_close=self.on_close)
        self.ws.run_forever()

    def on_error(self, error):
        print(error)

    def on_close(self):
        print "connection lost"

    def on_message(self, message):
        message = json.loads(message)
        biomarkers = message[u'features']
        c1 = biomarkers[u'c1']
        self.buf.append(c1)

当我在类范围之外定义函数 on_error、on_close 和 on_message 时,将 self 替换为 ws 并从它们的调用中省略 self,它就可以工作。但后来我不能使用

self.buf.append(c1)  

这是以后使用的关键

编辑: 我在错误之前运行的代码,以及在有效的情况之前运行的代码:

from NeuroStream import *
ns = NeuroStream('a_sensor', 'a_token')
ns.stream()

我得到的错误是:

'找不到记录器“websocket”的处理程序'

我看到了一个类似的帖子,但没有帮助: Using a websocket client as a class in python

【问题讨论】:

你能告诉我们你正在运行什么代码来得到那个错误吗? 不应该 d.stream()ns.stream()d 来自哪里? 对不起,你是对的,别介意 【参考方案1】:

我观察到两个问题。

1) "wss://api.foofoo.com/api/v1/features/" + self.sensor 应该是 "wss://api.foofoo.com/api/v1/features/" + self._sensor,因为您在初始化期间定义了 self._sensor = sensor

2) 看起来您正在尝试使用 websocket 库的客户端功能。 尝试如下安装websocket-client,然后重新运行代码。pip install websocket-client

通过以上两个更改,代码对我有用。

Python 2.7.14 (default, Mar 22 2018, 14:43:05) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from aam import NeuroStream
>>> ns = NeuroStream('a_sensor', 'a_token')
>>> ns.stream()
>>>

【讨论】:

以上是关于如何在类中实现 websocket?的主要内容,如果未能解决你的问题,请参考以下文章

如何在此服务器中实现 Websocket 握手?

如何在一个类中实现 asyncio websockets?

如何在 AngularJS 中实现 websockets?

如何在类中实现mousePressEvent(QMouseEvent * event)?

如何在类中实现标准迭代器

如何在类控制器中实现api swagger的spring注释?