1

我有以下代码:

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 个长度的内容。它真的很奇怪,我被困住了。任何帮助表示赞赏。谢谢。

4

3 回答 3

2

您假设 in.read() 填充缓冲区。你不能这样假设。请参阅 Javadoc。由于 EOS,它只需要读取至少一个字符,或者返回 -1。

于 2012-06-22T23:32:37.037 回答
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();

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

于 2012-06-22T23:54:39.983 回答
0

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

于 2012-06-23T02:28:17.570 回答