[英]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永远附加到字符串生成器中。
然而:
我建议您在服务器中使用现有的HTTP服务器框架来读取和解析请求,而不是编写自己的请求。 (或者,如果要使用自己的套接字代码,请至少使用现成的HTTP请求解析器/响应序列化器。)
您的客户端和服务器代码都忽略字符编码。 您需要使用Charset实例将字节与char转换为char。
在客户端中使用HttpURLConnection,而不是简单的TCP套接字。
更好的是,为您的HTTP功能使用https://hc.apache.org/之类的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.