Несколько HTTP-запросов / W один сокет - PullRequest
2 голосов
/ 21 марта 2012

Я создаю HTTP-клиент, который обрабатывает HTTP-запросы и ответы с помощью сокета.Он может отправить первый запрос и прочитать поток ответа.Однако последующие запросы ничего не записывают в поток ввода.

static String host/* = some host*/;
static int port/* = some port*/;

private Socket sock = null;
private BufferedWriter outputStream = null;
private BufferedReader inputStream = null;

public HttpClient() throws UnknownHostException, IOException {

    sock = new Socket(host, port);
    outputStream = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
    inputStream = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    sock.setKeepAlive(true);
    sock.setTcpNoDelay(true);
}

/* ... */
public String sendGetRequest(String relAddr) throws IOException {

    outputStream.write("GET " + relAddr + " HTTP/1.0\r\n");
    outputStream.write("\r\n");
    outputStream.flush();

    String line;
    StringBuffer buff = new StringBuffer();

    while((line = inputStream.readLine()) != null) {
        buff.append(line);
        buff.append("\n");
    }

    return buff.toString();
}

В основном методе я использую следующее:

client = new HttpClient();
str = client.sendGetRequest(addr);
System.out.println(str);
/* and again */
str = client.sendGetRequest(addr);
System.out.println(str);

Но только первый вызов sendGetRequest возвращает ответстрока.Последующие не делают.У вас есть идея?

1 Ответ

1 голос
/ 21 марта 2012

HTTP 1.0 не поддерживает постоянные соединения как часть фактической спецификации (очевидно, существует неофициальное расширение ). Вам нужно переключиться на 1.1 (или использовать неофициальное расширение, если сервер его поддерживает).

...