我正在尝试使用JSON-RPC over TLS与ElectrumX服务器通信,但是通过Tor(本地主机上的SOCKS代理)。
运行以下代码时,drain()
中的asyncio.streams
正在SSLProtocol中调用_drain_helper
,我不知道如何实施。
如果我只是让它成为无操作,它似乎不起作用。
我知道JSON-RPC服务器正在运行,因为我已经使用
进行了测试echo -ne '{"id":0,"args":["3.0.2","1.1"],"method":"server.version"}\n' | socat stdio openssl-connect:songbird.bauerj.eu:50002,verify=0
我尝试在Python中通过SOCKS使用TLS和asyncio:
from asyncio.sslproto import SSLProtocol
import aiosocks
import asyncio
loop = None
class MySSLProtocol(SSLProtocol):
def __init__(otherself):
super().__init__(loop, None, False , None)
# app_proto context waiter
async def l(fut):
try:
socks4addr = aiosocks.Socks4Addr("127.0.0.1", 9050)
transport, protocol = await aiosocks.create_connection(MySSLProtocol, proxy=socks4addr, proxy_auth=None, dst=("songbird.bauerj.eu", 50002))
reader = asyncio.StreamReader()
reader.set_transport(transport)
writer = asyncio.StreamWriter(transport, protocol, reader, loop)
writer.write(b'{"id":0,"method":"server.version","args":["3.0.2", "1.1"]}\n')
await writer.drain()
print(await reader.readuntil(b"\n"))
fut.set_result("finished")
except BaseException as e:
fut.set_exception(e)
def f():
global loop
loop = asyncio.get_event_loop()
fut = asyncio.Future()
asyncio.ensure_future(l(fut))
loop.run_until_complete(fut)
print(fut.result())
loop.close()
f()
我正在使用主人的aiosocks
。提交932374c
答案 0 :(得分:0)
asyncio.sslproto
和SSLProtocol
是asyncio私有API的一部分。
你不应该直接使用该类或从中派生。
要使用SSL,请将正常协议(源自asyncio.Protocol
)和ssl.SSLContext
作为ssl
param传递到loop.create_connection()
/ loop.create_server()
。