2012-03-21 80 views
1

我正在創建一個HTTP客戶端,它處理HTTP請求和使用套接字的響應。它能夠發送第一個請求並讀取響應流。但是後續請求不會寫入任何內容到輸入流。多個HTTP請求/ w單個套接字

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(); 
} 

在main方法,我使用下面的:

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

但只有第一sendGetRequest調用返回一個響應字符串。後來的人沒有。你有好主意嗎?

+0

對於每個請求,您應該可以對輸入/輸出流進行「打開()」和「關閉()」...即使套接字被重用。 – Marcelo 2012-03-21 15:07:06

+0

實際上,如果我在每次請求之前重新創建客戶端對象,那麼一切都很完美。不過,我希望這個套接字是持久的。 – 2012-03-21 15:16:14

+0

@Marcelo那會關閉插座。 – EJP 2012-03-21 21:17:54

回答

1

作爲實際規範的一部分,HTTP 1.0不支持持續連接(顯然存在unofficial extension)。您需要切換到1.1(或使用非官方擴展,假設服務器支持它)。

+0

小心引用該說法? – 2012-03-21 15:24:46

+2

@EdwardThomson - 增加了澄清,以及關於在HTTP 1.0下保持匿名的TIL。 – jtahlborn 2012-03-21 15:35:02

+2

這很公平。我承認它不符合HTTP/1.0的規範,但值得指出的是,即使古老版本的Apache和IIS支持HTTP/1.0保持活躍。 – 2012-03-21 16:17:23