python套接字未连接到Web服务器

问题描述

我正在尝试使用python socket模块连接到ngrok服务器。如果我将ngrok放入浏览器,则它可以正确连接,因此问题出在我的客户端代码上。这是服务器代码

#server.py
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
if __name__ == "__main__":
    HOST,PORT = "192.168.86.43",8080
    server = socketserver.Tcpserver((HOST,PORT),MyTCPHandler)
    server.serve_forever()

这是客户:

#client.py
import socket
with socket.socket(socket.AF_INET,socket.soCK_STREAM) as sock:
    sock.connect(("http://urlhere.ngrok.io",8080))
    sock.sendall(bytes("Hello" + "\n","utf-8"))

谢谢!

解决方法

通常,您应该能够连接到任何全局可用的地址或DNS名称,以确保途中没有网络限制。但是,如果通过Internet通信,则必须侦听本地可用于全局路由的地址。

对于特定的代码,有两个问题:

  1. 套接字应连接到地址或DNS名称。协议由套接字类型定义。就您而言
import socket
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as sock:
    sock.connect(("localhost",8080))
    sock.sendall(bytes("Hello" + "\n","utf-8"))
  1. 您正在将服务器绑定到某个特定的无关地址。要运行代码,您应该绑定到本地主机或“任何可用的”地址“ 0.0.0.0”:
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        self.data = self.request.recv(1024).strip()
        print("{} wrote:".format(self.client_address[0]))
        print(self.data)
if __name__ == "__main__":
    HOST,PORT = "0.0.0.0",8080
    server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
    server.serve_forever()
,

似乎您要实现的目标(即为connect提供一些ngrok公共地址)无法像您尝试的那样完成。如预期的那样,Accessing python server (web server) using ngrok建议使用gethostbyname也不起作用。

执行此操作的方法似乎是通过ngrok保留“保留的远程地址”(请参阅​​Listening on a reserved remote address)。然后,Python TCP Server and Client似乎与您要尝试的工作非常接近。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...