2012-02-29 21 views
2

我在寫一個簡單的Java HTTP服務器,它響應JSON數據。我在發送數據之前嘗試GZip數據,但通常會發回gzip壓縮的數據,導致瀏覽器中出現錯誤。例如,在Firefox中,它會顯示:GZIPOutputStream未正確壓縮HTTP響應的字符串

內容編碼錯誤 您嘗試查看的頁面無法顯示,因爲它使用無效或不受支持的壓縮形式。

有時候,如果我壓縮的字符串很小而沒有某些字符,但它似乎在有括號等時會弄亂。特別是,下面的示例文本失敗。

這是一種字符編碼問題嗎?我嘗試了各種各樣的東西,但它只是不想輕鬆工作。

String text;    
private Socket server; 
DataInputStream in = new DataInputStream(server.getInputStream()); 
PrintStream out = new PrintStream(server.getOutputStream()); 

while ((text = in.readLine()) != null) { 
    // ... process header info 
    if (text.length() == 0) break; 
} 

out.println("HTTP/1.1 200 OK"); 
out.println("Content-Encoding: gzip"); 
out.println("Content-Type: text/html"); 
out.println("Connection: close"); 


// x is the text to compress 
String x = "jsonp1330xxxxx462022184([["; 
ByteArrayOutputStream outZip = new ByteArrayOutputStream(); 
GZIPOutputStream gzip = new GZIPOutputStream(outZip); 

byte[] b = x.getBytes(); // Changing character encodings here makes no difference 

gzip.write(b); 
gzip.finish(); 
gzip.close(); 
outZip.close(); 
out.println(); 
out.print(outZip); 
server.close(); 
+0

Jusr好奇,你正在使用哪個Server?導致這樣的設置在服務器級別更容易完成。例如:對於tomcat,您必須爲內容類型「application/json」啓用'gzip'壓縮,然後就完成了。或者你自己寫的服務器是你自己的第一個聲明說的嗎? – Nikhil 2012-02-29 07:38:01

+1

您至少在內容之前的最後一個響應標題行後面缺少一個'CRLF'。 – Bombe 2012-02-29 07:50:12

+0

感謝評論傢伙 - 我實際上是在編寫我自己的服務器,因爲它實際上只是一個簡單的任務。我打開一個端口,只聽Javascript的JSONP請求的請求。 我希望有沒有真正的安全隱患。 關於CRLF,我相信我已經接近底部了: out.println(); – DFx 2012-02-29 13:47:50

回答

2

與直覺相反,我不認爲GZIPOutputStream適合流式傳輸。試試這個:

... 
out.println("Content-Encoding: deflate"); // NOTICE deflate encoding 
out.println("Content-Type: text/html"); 
out.println("Connection: close"); 
out.println(); 
String x = "jsonp1330xxxxx462022184([["; 
DeflaterInputStream dis = new DeflaterInputStream(out); 
dis.write(x.getBytes("utf-8")); // JSON is UTF-8 
dis.close(); 
server.close(); // this a bad idea, the client may not have read the data yet 
+0

謝謝! 我不得不將DeflaterInputStream更改爲DeflaterOutputStream,但是這個工作就像一個魅力! 關閉服務器連接之前應該等待什麼?它似乎以這種方式工作,但正如你所說,我不希望過早的隨機下降發生。 – DFx 2012-02-29 13:52:29

+0

實際上,如果在關閉套接字之前刷新()輸出流(在你的情況下爲'out'),那可能就沒有問題了。如果您滿意,請將此答案標記爲正確。 – brettw 2012-02-29 23:58:36

+0

感謝您的幫助! – DFx 2012-03-01 04:26:16