我有以下代码:
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个长度的内容。它真的很奇怪,我被卡住了。任何帮助表示赞赏。感谢。
答案 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()以完全获取请求。谢谢你们所有人!