套接字上的InputStreamReader没有完全读取POST请求

时间:2012-06-22 23:28:41

标签: java sockets

我有以下代码:

ServerSocket ss = new ServerSocket(2351);

Socket s = ss.accept();
InputStreamReader in = new InputStreamReader(s.getInputStream());
writer = new PrintWriter(s.getOutputStream());
writer.flush();

cbuf = new char[buf_length];
in.read(cbuf);
inputLine = new String(cbuf);

我连续四次发送到我的服务器,当我调试上面的代码时,它运行正确三次。另一次以下是我从套接字读取的inputLine:

POST /record HTTP/1.1
Content-type: application/soap+xml;charset="utf-8";action=""
Accept: application/soap+xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
User-Agent: JAX-WS RI 2.1.5-b03-
Host: localhost:2351
Connection: keep-alive
Content-Length: 2197

内容只有2197个空格而不是2197个长度的内容。它真的很奇怪,我被卡住了。任何帮助表示赞赏。感谢。

3 个答案:

答案 0 :(得分:2)

您假设in.read()填充缓冲区。你不能假设。见Javadoc。它只需读取至少一个字符,或因EOS而返回-1。

答案 1 :(得分:0)

我会尝试让EJP的答案更具体。而不是

n.read(cbuf);
inputLine = new String(cbuf);

您需要执行以下操作:

StringBuilder sb = new StringBuilder();
int charsRead;
while ((charsRead = n.read(cbuf)) != -1) {
    sb.append(cbuf, 0, charsRead);
}
inputLine = sb.toString();

这可能不是您要问的问题的答案,但它绝对是您发布的代码中的错误。

答案 2 :(得分:0)

@EJP:我重写了我的代码,终于工作了。问题是在某些情况下,in.read()在第一次尝试时只读取POST请求的标题。我必须检查内容长度字段,如果它小于您指出的读取字符数,我必须再次执行in.read()以完全获取请求。谢谢你们所有人!