2010-06-30 60 views
4

我正在使用套接字爲給定服務器創建POST請求。響應大部分回來了,我使用InputStream和「UTF-8」編碼來讀取服務器的響應。大部分的迴應是有道理的,而且我能夠正確地查看HTML,但是,看起來隨機的,我看到諸如「1ffa」,「6e8」,「1972」,「90」,「0」等代碼出現我正在閱讀中的單行響應。以下是我如何創建和閱讀響應。使用套接字的HTTP響應中的隨機字符

String hostname = "server"; 
    SocketFactory socketFactory = SSLSocketFactory.getDefault(); 
    Socket socket = new Socket(hostname, 8080); 
    // Create streams to securely send and receive data to the server 
    InputStream in = socket.getInputStream(); 
    OutputStream out = socket.getOutputStream(); 
    PrintWriter writer = new PrintWriter(out); 
    writer.println("POST /handlerServlet http/1.1"); 
    writer.println("Host: " + hostname); 
    String parameters="params=" + URLEncoder.encode("paramsToEncode", "UTF-8"); 
    writer.println("Content-Length: " + parameters.length()); 
    writer.println("Content-Type: application/x-www-form-urlencoded"); 
    writer.println("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 
    writer.println("Keep-Alive: 115"); 
    writer.println("Connection: keep-alive"); 
    writer.println("\r\n" + parameters + "\r\n"); 
    writer.flush(); 
    // Read from in and write to out... 
    String input = ""; 
    BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); 
    StringBuffer result = new StringBuffer(); 
    boolean startWriting = false; 
    FileOutputStream outStream1 = new FileOutputStream(new File("/file1.txt")); 
    Writer outWriter = new OutputStreamWriter(outStream1, "UTF-8"); 

    while ((input = reader.readLine()) != null) { 
    result.append(input); 
    outWriter.write(input + "\n"); 
    result.append('\n'); 
    } 
    System.out.println(result.toString()); 
    outWriter.close(); 
    // Close the socket 
    in.close(); 

有沒有人有任何線索,爲什麼我會看到這樣的字符?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
<base href="http://server:8080/HW/YX+JpCEnNDe5B87CCyFj5KR7z9rqlwRK77aMm/44221331.htm"> 

1ffa 

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title></title> 
</head> 
<body bgcolor="#ffffff"> 
<!-- Created by Oracle Reports 21:14 Tue Jun 29 09:14:32 PM, 2010 --> 
.... 
<tr valign=top> 
    <td height=10></td> 
    <td width=80 colspan=3 align=center><font size=2 face="helvetica">V002A050001</font></td> 
    < 
1ffa 
td></td> 

你可以看到,有這些字符出現在隨機位置會導致對HTML代碼的一些hecktick行爲。

謝謝。

+0

爲什麼不使用['URLConnection'](http://stackoverflow.com/questions/2793150/how-to-use-java-net-urlconnection-to-fire-and-handle-http-requests )或[Apache HttpComponents客戶端](http://hc.apache.org/httpcomponents-client/)?他們更透明地處理這個問題。 – BalusC 2010-06-30 01:31:08

回答

8

你是否在你的回覆中得到了一個表示這樣的標題?

Transfer-Encoding: chunked 

在這種情況下,最有可能是由於HTTP Chunked Transfer Encoding。這是正常的。

+1

...並且您應該根據響應標題以不同方式處理它。由於另一方顯然是'Servlet',因此您可以事先設置'Content-Length'標頭,以避免它以塊的形式發送主體。你可以使用'response.setContentLength()'。 – BalusC 2010-06-30 01:28:32

+0

確實,設置內容長度是一個很好的解決方法。我還建議使用現有的HTTP客戶端庫(除非有限制)。周圍有很多,他們傾向於處理好這一點。 – Bruno 2010-06-30 01:31:52

+0

是的,我已經評論說,在這個問題上:) – BalusC 2010-06-30 01:32:39