【问题标题】:How to solve websocket ping timeout?如何解决 websocket ping 超时?
【发布时间】:2018-06-09 07:00:17
【问题描述】:

在运行以下代码时(理论上它应该每分钟发送一个值)

from __future__ import print_function
from twisted.internet.ssl import CertificateOptions
options = CertificateOptions()
from os import environ
from twisted.internet.defer import inlineCallbacks
from twisted.internet import reactor
from autobahn.twisted.wamp import ApplicationSession, ApplicationRunner
from autobahn import wamp
from datetime import datetime, timedelta
import xlwings as wb
import time
import xlwings as wb

class Component(ApplicationSession):

"""
An application component that publishes an event every second.
"""

@inlineCallbacks
def onJoin(self, details):
    print("session attached")


while True:
    try:
        wb.Book(r'C:\Users\Administrator\Desktop\Datasets\test_feed.xlsx')
        e = wb.Range('A2').value
        b = wb.Range('C2').value
        c = wb.Range('E2').value
    except Exception:
        print("----Waiting for RTD server response----")
        time.sleep(1)          
    try:                
        epoch = datetime(now.year, now.month, now.day)
        result = epoch + timedelta(days=c)
        result = result.replace(microsecond=0, second=0)
        if result > now:
            now = result
            print("Stock", e, "Time", now, "Price", b)
            self.publish(u'com.myapp.ma', b)
    except Exception:
        print("-----Waiting1 for RTD server response----")
        time.sleep(1)
def onDisconnect(self):
        print("disconnected")
        reactor.stop()



if __name__ == '__main__':
    runner = ApplicationRunner(
        environ.get("AUTOBAHN_DEMO_ROUTER", u"ws://127.0.0.1:8080/ws"),
        u"crossbardemo")
    runner.run(Component)

返回如下错误

2017-12-28T18:43:52+0100 [Router       1604] dropping connection to peer tcp4:127.0.0.1:61531 with abort=True: WebSocket ping timeout (peer did not respond with pong in time)
2017-12-28T18:43:52+0100 [Router       1604] session "8526139172223346" left realm "crossbardemo"

我尝试解决这个问题的方法:

我)

from twisted.internet.ssl import CertificateOptions
options = CertificateOptions()
if __name__ == '__main__':
    runner = ApplicationRunner(
        environ.get("AUTOBAHN_DEMO_ROUTER", u"ws://127.0.0.1:8080/ws"),
        u"crossbardemo", ssl=options)
    runner.run(Component)

二)

if __name__ == '__main__':
    runner = ApplicationRunner(
        environ.get("AUTOBAHN_DEMO_ROUTER", u"ws://127.0.0.1:8080/ws"),
        u"crossbardemo",
    )
    runner.run(Component, auto_reconnect=True)

三)

注册编辑

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS

1.0]

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS

1.0\客户端] "DisabledByDefault"=dword:00000000 “启用”=dword:00000001

四)

安装证书模块(pip install certifi)设置SSL_CERT_FILE,比如 导出 SSL_CERT_FILE="$(python -m certifi)"

仍然是同样的错误。我在 Windows 10 上运行,带有交叉开关演示路由器、高速公路和扭曲。

路由器配置链接:

https://github.com/crossbario/autobahn-python/tree/master/examples/twisted/wamp/pubsub/basic/.crossbar

另外,下面的示例代码工作正常:

counter = 100
        while True:
            print("publish: com.myapp.ma", counter)
            self.publish(u'com.myapp.ma', counter)
            counter += 100
            yield sleep(30)

【问题讨论】:

  • 您没有到服务器的路由或服务器没有运行。首先从 cmd.exe >Pin IP 让 ping 正常工作。不要使用 127.0.0.1(环回),因为大多数计算机未配置为使用环回。您必须修改 PC 上的主机文件才能使环回工作。而是使用您计算机的 IP 地址。
  • @jdweng 尝试了您的解决方案,不幸的是没有成功。得到下一个错误:WebSocket 打开握手失败('Unsupported HTTP version ('HTTP/1.0')')
  • @Jean-PaulCalderone 完成。
  • 现在您实际上是在连接到服务器,而在您没有连接之前。在 HTTP/1.0 之前从未见过错误。 HTTP 1) 1.0 有两个版本:Stream 2) 1.1 Chunk。通常网页是向后兼容的,因此 1.1 与 1.0 一起使用,但 1.0 并不总是与 1.1 一起使用。这是我第一次看到服务器不接受 1.0。我在发布的代码中看不到任何会迫使您的客户进入 1.0 的内容。您请求中的 http 标头与服务器不兼容。通常我建议使用像wireshark或fiddler这样的嗅探器来帮助隔离问题。

标签: python ssl wamp twisted autobahn


【解决方案1】:

为了让 Twisted 处理更多的 I/O 事件,您必须将控制权交还给反应器。 Twisted 实现了一个协作多任务系统。各种任务在反应器线程中运行。这是通过每项任务仅花费短暂的控制时间来完成的。代码如下:

while True:
     ...
     sleep(1)

防止任何其他任务获得执行控制权,并防止反应器获得控制权以服务 I/O 事件。

由于这段代码在一个用inlineCallbacks 修饰的函数中,所以有一个很小的变化,至少不会与 Twisted 的操作模式完全不兼容。

试试这个表达式,而不是time.sleep(1)

yield deferLater(reactor, 1, lambda: None)

然后从twisted.internet.task 导入deferLater。这将执行“睡眠”,将控制权交还给反应堆,并让其他任务在睡眠期间执行。这应该允许 Autobahn 发送必要的 ping/pong 消息,并允许它处理您的 publish 呼叫。

【讨论】:

  • 当更改为 yield deferLater(reactor, 1, lambda: None) 时,它给出了相同的错误。更改为 (5) 时,出现以下错误: session closed with reason wamp.close.transport_lost [WAMP transport was lost without close the session before]。可以肯定地说,通过 Twisted、Autobahn 或 Crossbar 以“高”频率发送数据几乎是不可行的吗?
  • 不,这不是正确的结论。
  • 我的猜测是您的应用程序中的某处仍有更多阻塞代码仍在干扰。
  • 我找到了问题;是 xlwings 终止了连接。感谢您抽出宝贵时间。
猜你喜欢
  • 2021-08-16
  • 2020-12-29
  • 2016-10-31
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2019-08-10
  • 2019-07-18
相关资源
最近更新 更多