簡體   English   中英

套接字的InputStream不可讀

[英]InputStream of a socket not readable

我有一個HTML表單,該表單向我用Java制作的套接字發出POST請求。 我讀了每一行

 /**
 * Read a line from an {@link InputStream}
 * @param inFromClient The {@link InputStream} to read from
 * @return The {@link String} read
 * @throws IOException When something went wrong while reading
 */
private String readLine(InputStream inFromClient) throws IOException {
    StringBuilder lineb = new StringBuilder();
    char c = (char) inFromClient.read();
    while (c != '\n'){
        lineb.append(Character.toString(c));
        c = (char) (inFromClient.read());        
    }
    String line = lineb.toString();
    return line.substring(0,line.lastIndexOf('\r')<0?0:line.lastIndexOf('\r'));
}

這樣,我就可以解析請求直到邊界,然后保存發送的文件。 一切正常。

但是,我也試圖用Java向同一套接字發出POST請求。 首先,創建另一個連接到服務器套接字的套接字。 然后我做:

PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
pw.println("POST / HTTP/1.1");
pw.println("Host: ...");
...

問題

問題是,我的方法無法讀取任何行,並且所有結果都在第5行出現“ OutOfMemory”異常。為什么當我可以讀取從我的瀏覽器發送的行時,我無法讀取從Java套接字發送的行(html格式) ) ? 謝謝。

您的服務器代碼必須將()讀入一個int並在轉換為char之前檢查它是否為-1。 您將忽略流中的文件末尾,並將-1永遠附加到字符串生成器中。

然而:

  1. 我建議您在服務器中使用現有的HTTP服務器框架來讀取和解析請求,而不是編寫自己的請求。 (或者,如果要使用自己的套接字代碼,請至少使用現成的HTTP請求解析器/響應序列化器。)

  2. 您的客戶端和服務器代碼都忽略字符編碼。 您需要使用Charset實例將字節與char轉換為char。

  3. 在客戶端中使用HttpURLConnection,而不是簡單的TCP套接字。

  4. 更好的是,為您的HTTP功能使用https://hc.apache.org/之類的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM