繁体   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