java - 套接字的输入流不可读

标签 java sockets post encoding outputstream

我有一个 HTML 表单,它向我用 Java 创建的 Socket 发出 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 形式)?谢谢。

最佳答案

您的服务器代码必须 read() 到 int 中,并在转换为 char 之前检查它是否为 -1。您忽略流中的文件结尾并将 -1 永远附加到字符串生成器。

但是:

  1. 我建议使用服务器中现有的 HTTP 服务器框架来读取和解析请求,而不是编写自己的框架。 (或者,如果您想使用自己的套接字代码,至少使用现成的 HTTP 请求解析器/响应序列化器。)

  2. 您的客户端和服务器代码都会忽略字符编码。您需要使用 Charset 实例将字节与字符相互转换。

  3. 在客户端中使用 HttpURLConnection,而不是简单的 TCP 套接字。

  4. 更好,使用类似 https://hc.apache.org/ 的内容用于您的 HTTP 功能。

关于java - 套接字的输入流不可读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22253220/

相关文章:

c# - C# 中的套接字问题

c++ - boost::asio 写入大尺寸时挂起

javascript - CoffeeScript $.post 从返回对象获取字符串

php - Httpful 发布表单数据

java - Seam 2.2.2.Final 使用 maven 和 Jboss 6

循环中的java setText

django - 无法通过 group_send 向 Django channel 发送消息

javascript - 用替代内容(HTML + CSS + JS)替换整个网页

java - 用于检查已使用文件的 Windows 工具(通过 Java OSGi 进程)

java - 为什么 KeyListener 仅在未按下按钮时才起作用?