python socket not connecting to web server

↘锁芯ラ 提交于 2020-12-15 06:38:28

问题


I'm trying use the python socket module to connect to an ngrok server. If I put the ngrok into my browser it connects properly so the problem is somewhere with my client code. Here is the server code:

#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()

And here is the client:

#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"))

Thanks!


回答1:


It seems that what you are trying to achieve, i.e., provide some ngrok public address to connect, cannot be done the way you try it. Accessing python server (web server) using ngrok, as expected, suggests that using gethostbyname also will not work.

It seems that the way to do it is to make through ngrok a reservation for a "reserved remote address" (see Listening on a reserved remote address). Then, Python TCP Server and Client seems to be very close, if not identical, to what you are trying to do.




回答2:


In general you should be able to connect to any globally available address or DNS name, ensuring there is no network restrictions on the way. However you have to listen on the address that is locally available for global routing if you are communicating across the Internet.

As for particular code, there are 2 issues:

  1. Socket should be connected to an address or DNS name. The protocol is defined with the socket type. In your case
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. You're binding in the server to some speciffic not related address. To run your code you should bind to either localhost or to "any available" address "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()


来源:https://stackoverflow.com/questions/64594627/python-socket-not-connecting-to-web-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!