繁体   English   中英

Python套接字错误300“永久移动”

[英]Python Socket Error 300 'Moved Permanently'

我一直在尝试运行此代码以开始与其他站点的通信,但无法建立一个。 有人可以帮我解决我在这里所缺少的吗?

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(s)

server = 'www.python.org'
port = 80 #defining port / acting like a browser

server_ip = socket.gethostbyname(server)
print(server_ip)

request = "GET / HTTPS/1.1\nHost: "+server+"\n\n"
s.connect((server_ip,port))
s.send(request.encode())
result = s.recv(4096)

while (len(result) > 0):
     print(result)
     result = s.recv(1024)

每次在不同的站点上,我都收到以下错误消息:

<socket.socket fd=508, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>

151.101.152.223 b'HTTP / 1.1 301永久移动\\ r \\ n服务器:Varnish \\ r \\ n重试后:0 \\ r \\ n位置: https ://www.python.org/ \\ r \\ n内容长度:0 \\ r \\ n接受范围:字节\\ r \\ n日期:2018年12月5日星期三17:10:03 GMT \\ r \\ nVia:1.1清漆\\ r \\ n连接:close \\ r \\ nX-Served-By:cache-bom18222-BOM \\ r \\ nX缓存:HIT \\ r \\ nX缓存访问:0 \\ r \\ nX计时器:S1544029803.224270,VS0,VE0 \\ r \\ n严格传输安全性:max-age = 63072000; includeSubDomains \\ r \\ n \\ r \\ n”

在多个级别上,此请求是错误的:

port = 80 #defining port / acting like a browser
...
request = "GET / HTTPS/1.1\nHost: "+server+"\n\n"

没有HTTPS/1.1协议。 只有HTTP/1.1 要访问https://.. URL,您需要首先连接到站点(默认端口443,而不是您使用的80), 将TCP套接字升级到SSL并发出正确的HTTP请求,即使用HTTP/1.1 HTTPS/1.1

此外,行和标头分隔符必须为\\r\\n而不是您使用的\\n 但是大多数服务器将忽略差异。

同样, HTTP/1.1隐式启用持久HTTP连接(HTTP保持活动状态)。 这意味着服务器可能不会像您的代码预期的那样在响应后立即关闭连接,但是可能会等待很长时间才能在同一连接中等待更多请求。 对于这样的简单请求,最好使用HTTP/1.0 ,它没有隐式的保持活动状态,并且在其他方​​面也更简单(没有分块传输编码)。

.... b'HTTP/1.1 301 Moved Permanently ... Location: https://www.python.org/

这甚至不是错误。 这是一个HTTP重定向,它指示您应使用https://访问该站点(您可能尝试这样做但使用了错误的方式)。

最后,您的代码可能如下所示:

import socket
import ssl

(server,port) = ('www.python.org',443)
request = "GET / HTTP/1.0\r\nHost: "+server+"\r\n\r\n"

s = socket.socket()
s.connect((server,port))
s = ssl.create_default_context().wrap_socket(s, server_hostname=server)
s.send(request.encode())

result = s.recv(4096)
while (len(result) > 0):
     print(str(result))
     result = s.recv(1024)

尽管如此,即使此代码正常工作,我仍建议使用HTTP库(例如request) 如果您坚持要编写自己的HTTP堆栈,那么请研究该标准-该协议比仅仅看几个示例所建议的要复杂得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM