- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想用 asyncio 创建一个 ReconnectingClientFactory
。特别是处理客户端启动时服务器不可用的情况,在这种情况下 ReconnectingClientFactory
将继续尝试。这是 asyncio.events.create_connection
不会做的事情。
具体来说:
EchoClient例子会很好。关键在于如何建立连接。
factory = EchoClientFactory('ws://127.0.0.1:5678')
connectWS(factory)
对于带有 ReconnectingClientFactory
的twisted 版本。
对比
factory = EchoClientFactory(u"ws://127.0.0.1:5678")
factory.protocol = SecureServerClientProtocol
loop = asyncio.get_event_loop()
# coro = loop.create_connection(factory, 'ws_server', 5678)
coro = loop.create_connection(factory, '127.0.0.1', 5678)
loop.run_until_complete(asyncio.wait([
alive(), coro
]))
loop.run_forever()
loop.close()
或与asycnio类似版本。
问题是在 asyncio 版本中,连接是由 asyncio.events.create_connection
建立的,如果服务器不可用,它就会失败。
我怎样才能调和这两者?
非常感谢
最佳答案
我想我得到了你想要的。这是基于 asyncio TCP echo client protocol example 的代码和示例.
import asyncio
import random
class ReconnectingTCPClientProtocol(asyncio.Protocol):
max_delay = 3600
initial_delay = 1.0
factor = 2.7182818284590451
jitter = 0.119626565582
max_retries = None
def __init__(self, *args, loop=None, **kwargs):
if loop is None:
loop = asyncio.get_event_loop()
self._loop = loop
self._args = args
self._kwargs = kwargs
self._retries = 0
self._delay = self.initial_delay
self._continue_trying = True
self._call_handle = None
self._connector = None
def connection_lost(self, exc):
if self._continue_trying:
self.retry()
def connection_failed(self, exc):
if self._continue_trying:
self.retry()
def retry(self):
if not self._continue_trying:
return
self._retries += 1
if self.max_retries is not None and (self._retries > self.max_retries):
return
self._delay = min(self._delay * self.factor, self.max_delay)
if self.jitter:
self._delay = random.normalvariate(self._delay,
self._delay * self.jitter)
self._call_handle = self._loop.call_later(self._delay, self.connect)
def connect(self):
if self._connector is None:
self._connector = self._loop.create_task(self._connect())
async def _connect(self):
try:
await self._loop.create_connection(lambda: self,
*self._args, **self._kwargs)
except Exception as exc:
self._loop.call_soon(self.connection_failed, exc)
finally:
self._connector = None
def stop_trying(self):
if self._call_handle:
self._call_handle.cancel()
self._call_handle = None
self._continue_trying = False
if self._connector is not None:
self._connector.cancel()
self._connector = None
if __name__ == '__main__':
class EchoClientProtocol(ReconnectingTCPClientProtocol):
def __init__(self, message, *args, **kwargs):
super().__init__(*args, **kwargs)
self.message = message
def connection_made(self, transport):
transport.write(self.message.encode())
print('Data sent: {!r}'.format(self.message))
def data_received(self, data):
print('Data received: {!r}'.format(data.decode()))
def connection_lost(self, exc):
print('The server closed the connection')
print('Stop the event loop')
self._loop.stop()
loop = asyncio.get_event_loop()
client = EchoClientProtocol('Hello, world!', '127.0.0.1', 8888, loop=loop)
client.connect()
loop.run_forever()
loop.close()
关于python - 高速公路 Asyncio ReconnectingClientFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37500945/
在 OSX 上使用 Chrome 连接到 websocket 服务器时出现问题。 我们使用这个包:https://github.com/voryx/Thruway 我在这里测试:http://webs
Autobahn 文档对于消息发布后哪些客户端/如何接收消息有点不清楚。开箱即用的消息似乎会广播给某个主题的所有订阅者 - 他们都收到了。但是有没有办法将消息分发给单个客户端呢?在队列中,多个发布者将
我想用 asyncio 创建一个 ReconnectingClientFactory。特别是处理客户端启动时服务器不可用的情况,在这种情况下 ReconnectingClientFactory 将继续
我正在使用 autobahn运行 websocket 服务器来补充我的 Django 应用程序。有时,我需要将消息从 Django 发送到 websocket 服务器,使用 websocket-cli
我正在通过 Python 的 multiprocessing.pipe 传输 WAMP 协议(protocol),我需要重新实现 WampCraClientProtocol。 问题 A:在不明确的情况
我是 websockets 的新手,我一直在使用 Autobahn websocket 来做一个更大的项目。它在 python 和 js 版本中运行良好,但我在使用 Android API 时遇到了问
是否可以使用默认的 Apple API?我知道它与谷歌有关,但我想尝试坚持使用苹果的一切。 最佳答案 根据documentation , 看起来 MKRoute 和 MKDirectionsReque
我有一个带有典型 onX 的高速公路 Websocket 服务器在它的协议(protocol)中起作用。我的问题是我找不到退出的方法 onX ,同时在特定消息到达时继续做我想做的各种事情。更具体地说在
语境 :我正在查询 OSRM 以返回两个坐标之间的路线。它返回我请求的路线以及部分(步骤)以及路线说明(v5 中的 RouteStep 对象数组)。 http://project-osrm.org/d
我在 Node 中使用此 AutobahnJS 代码从服务接收数据。它工作得很好,每秒获取多个事件。当我的互联网暂时断开连接时,Autobahn 没有检测到丢失的连接并且没有将“Websocket 连
如果由于某种原因连接“断开”,我正在尝试使用 Python 和 Autobahn 与 Twisted 重新连接客户端。 有一个很好的例子 here使用 ReconnectingClientFactor
我在 Payara 服务器上设置了一个 Java EE 端点,我尝试使用 Autobahn WebSockets 连接到一个 Android 客户端。我有以下设置: 我在服务器上的 WebSocket
我正在尝试使用 Python 3.4、Django、Autobahn 和 JS 构建 WebSocket session 。我已经在 python 端成功运行了 websocket 服务器,但是我无法
我是 Autobahn 和 Websockets 的新手。我正在尝试构建以下设置: 处理服务(基于 Java 的黑盒): 等待来自 Twitter 的流媒体 API 的数据 如果收到新消息,则会将消息
websocket 客户端(使用 Autobahn/Python 和 Twisted)需要连接到 websocket 服务器:客户端需要向服务器出示其客户端证书,客户端需要检查服务器的证书。例如,这些
我是一名优秀的程序员,十分优秀!