Проблема Python с сокетами - PullRequest
0 голосов
/ 02 марта 2011

Я работаю над простым проектом с использованием сокетов. Вроде как телнет. Я просто хочу подключиться к порту 80 и выполнить GET / Вот что я пытаюсь:

<code>
import socket
size = 100000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "localhost"
port = 80
s.connect((host, port))
stuff = "GET /"
s.send(stuff)
r = s.recv(size)
print(r)
Я запускаю его, он подключается, но я не получаю вывод GET /

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Спецификация HTTP говорит, что вам нужно две строки ('\r\n' * 2) после заголовка.Попробуйте:

stuff = 'GET /\r\n\r\n'
1 голос
/ 02 марта 2011

вашей главной проблеме является отсутствие новой строки после "GET /".Протокол HTTP требует новой строки, поэтому сервер ждет его, поэтому вы ждете ответа.

(Небольшая проблема заключается в том, что размер вашего буфера слишком велик, модуль сокетов Python рекомендуетнебольшая степень 2, например 4096.)

Я предлагаю:

import socket
size = 4096
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "localhost"
port = 80
s.connect((host, port))
stuff = "GET /\n"
s.send(stuff)
buf = ''
while True:
    r = s.recv(size)
    if not r: break
    buf += r

print(buf)

Цикл в конце гарантирует, что вы получите полный ответ.

И, наконец,Я рекомендую urllib2, который реализует для вас HTTP и избегает таких ошибок:

import urllib2
print(urllib2.urlopen('http://localhost').read())
1 голос
/ 02 марта 2011

Вам нужно как минимум пустую строку после GET /, поэтому используйте stuff = "GET /\n\n". Прочитайте этот пример .

...