gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:18:31 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com