Python TCP套接字在使用Ngrok时返回getaddrinfo失败

Python TCP套接字在使用Ngrok时返回getaddrinfo失败,python,sockets,ngrok,pyngrok,Python,Sockets,Ngrok,Pyngrok,我正在尝试使用Ngrok通过socket模块连接两个python脚本。我试着用ngrok.exe和pyngrok来做这件事。尝试使用端口12345或80与客户端连接,其他所有操作均超时 在客户端s.connectip上,端口没有错误,但是Python server.py和ngrok终端没有注册任何内容。当我将URL放入web浏览器时,该URL肯定可以工作,因为Ngrok注册了一个502坏网关 我假设这是因为套接字没有使用HTTP,而是使用TCP,但是当我使用TCP标志Ngrok.exe TCP

我正在尝试使用Ngrok通过socket模块连接两个python脚本。我试着用ngrok.exe和pyngrok来做这件事。尝试使用端口12345或80与客户端连接,其他所有操作均超时

在客户端s.connectip上,端口没有错误,但是Python server.py和ngrok终端没有注册任何内容。当我将URL放入web浏览器时,该URL肯定可以工作,因为Ngrok注册了一个502坏网关

我假设这是因为套接字没有使用HTTP,而是使用TCP,但是当我使用TCP标志Ngrok.exe TCP 12345启动Ngrok时,转发地址如下所示tcp://0.tcp.ngrok.io:xxxxx 当我将其放入客户端socket.connect时,它返回socket.gaierro:[Errno 11001]getaddrinfo失败

所以我想我的问题是,如何让Python客户端套接字接受这个地址,或者我应该做些不同的事情

谢谢

server.py

from pyngrok import ngrok
import socket

port = 12345

s = socket.socket()
s.bind(('', port))

public_url = ngrok.connect(port)
print("ngrok tunnel \"{}\" -> \"http://127.0.0.1:{}/\"".format(public_url, port))

s.listen(5)      
print("socket is listening" )

c, addr = s.accept()

print('Got connection from', addr )

c.send(str.encode(str("Yes")))

while True:
    c.recv(1024).decode("utf-8")
client.py

import socket
s = socket.socket()
url = "copied from server or ngrok"
ip = socket.gethostbyname(url)
port = 12345
s.connect((ip, 12345))
我是pyngrok的开发者,我看到你正在使用它。文档中实际上有一个TCP套接字/客户端集成示例,可以找到

但你走对了方向。简而言之,您没有指定协议,这意味着正在使用默认的http协议。您需要告诉pyngrok和ngrok您想要设置tcp隧道。因此,我们应该这样做:

ngrok_tunnel = ngrok.connect(port, "tcp", remote_addr="{}:{}".format(host, port))
print("ngrok tunnel \"{}\" -> \"tcp://127.0.0.1:{}/\"".format(ngrok_tunnel.public_url, port))

对于主机和端口,您需要首先设置一个ngrok子域,您可以这样做,比如host=1.tcp.ngrok.io。然后将同一主机/post传递给client.py,以及错误所在(包括tcp://),将其关闭。

gethostbyname需要一个主机名,而不是某个URL。这是。您需要使用的名称是URL中的域部分,然后您需要使用URL中的端口进行连接。只是一个友好的提示,请单击帮助您解决问题的福利社区成员答案上的复选标记。