Python 仅在浏览器上拒绝提供连接的套接字

Python socket giving connection refused only on browser

据我所知,这个应用程序将 100% 无法运行,但这只是为了测试,但我预计除了我的浏览器连接被拒绝之外还有其他错误,我什至没有得到我的浏览器尝试过的日志连接!所以它让我在让它工作之前思考我需要看看为什么它被拒绝(我这样做是为了试验 http!) 注意:我使用套接字而不是任何 HTTP 库,这个问题只存在于浏览器上而不是我写的客户端应用程序所以其他答案对我没有帮助 这是我的代码:

#!/usr/bin/python           # This is server.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 1234                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send(open("GPIOWEB/index.html").read())
   print c.recv(1024)
   c.close()                # Close the connection

客户:

#!/usr/bin/python           # This is client.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 1234                # Reserve a port for your service.

s.connect((host, port))
print s.recv(1024)
s.close                     # Close the socket when done

您在您的应用中实施了一个协议:

on_connect SERVER send index.html to CLIENT

您的客户使用此协议。浏览器没有。 使用嗅探器(wireshark、tcpdump 等...)查看服务器-客户端流量。

可以通过浏览器访问你的server.py程序,但是你需要告诉浏览器(这样它才能告诉OS)您希望如何到达那里。

当你这样做时

host = socket.gethostname() # Get local machine name
s.bind((host, 1234))        # Bind to the port

您正在绑定到特定界面。

在其中添加一个 print(host) 以查看您要绑定到的接口。然后,在您的浏览器中,输入 <host>:1234 作为地址——其中 <host> 是打印的内容。

您的浏览器将显示 GPIOWEB/index.html 的内容,您的 server.py 程序将显示如下内容:

Got connection from ('127.0.0.1', 63358)
GET / HTTP/1.1
Host: localhost:1234
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

或者,绑定到所有可用的接口,

port = 1234                 # Reserve a port for your service.
s.bind(('', port))          # Bind to the port

(注意主机使用的 ''

现在,您应该可以通过各种地址与程序通信了,例如:

localhost:1234
127.0.0.1:1234
<Your LAN IP>:1234

其中一些可能取决于您的防火墙设置,如果您没有得到预期的结果,您可以考虑暂时禁用它,然后适当地更新其配置。