簡體   English   中英

連接python套接字時從服務器清空響應

[英]Empty response from server when connecting with python socket

我正在嘗試使用Python連接到URL https://www.ssehl.co.uk/HALO/publicLogon.do

使用requests的簡單解決方案失敗:

import requests
r = requests.get('https://www.ssehl.co.uk/HALO/publicLogon.do')
print r.text

有錯誤

File "c:\Python27\lib\site-packages\requests\adapters.py", line 327, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.ssehl.co.uk', port=443): Max retries exceeded with url: /HALO/publicLogon.do (Caused by <class 'httplib.BadStatusLine'>: '')

所以我試圖使用庫socket從服務器獲取原始響應:

import socket   #for sockets
import sys  #for exit

#create an INET, STREAMing socket
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print 'Failed to create socket'
    sys.exit()

print 'Socket Created'
host = 'www.ssehl.co.uk';
port = 443;

try:
    remote_ip = socket.gethostbyname(host)

except socket.gaierror:
    #could not resolve
    print 'Hostname could not be resolved. Exiting'
    sys.exit()

#Connect to remote server
s.connect((remote_ip , port))

print 'Socket Connected to ' + host + ' on ip ' + remote_ip

#Send some data to remote server
message = "GET /HALO/publicLogon.do HTTP/1.1\r\n\r\n"

try :
   #Set the whole string
   s.sendall(message)
except socket.error:
   #Send failed
   print 'Send failed'
   sys.exit()

print 'Message send successfully'

#Now receive data
reply = s.recv(4096)

print reply

將輸出:

Socket Created
Socket Connected to www.ssehl.co.uk on ip 161.12.7.194
Message send successfully
Reply: 

回復后有一些我無法粘貼的垃圾,但這是一個崇高的控制台截圖:

截圖

有沒有辦法從服務器獲得200響應,就像瀏覽器一樣?

出於某種原因,當您使用Python內置的東西(urllib2,請求,httplib)甚至命令行內容(curl,wget)而不是https時,服務器會出現並給出錯誤的響應。

但是,當您通過常規http請求頁面時,它可以正常工作,例如:

import urllib2
print urllib2.urlopen('http://www.ssehl.co.uk/HALO/publicLogon.do').getcode()

打印出來

>> 200

我的猜測是他們的服務器配置錯誤,你的瀏覽器以某種方式靜默地處理它。

當我使用端口80時,它對我有用。 Sooo: port = 80;

使用HTTPS服務器認為Python時必定會出現一些錯誤...
此外,您發送錯誤的請求。 您沒有發送hostname

修復了請求: message = "GET /HALO/publicLogon.do HTTP/1.1\\r\\nHostname: %s\\r\\n\\r\\n"%host


所以是工作代碼。


我認為問題存在,因為端口443加密的 Python不支持加密(可能)。

如果需要支持https,則應使用ssl.wrap_socket

有關詳細信息,請參見http://docs.python.org/2/library/ssl.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM