1

I have the following code:

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);

I ran four consecutive sends to my server and when I debug the above code it runs correctly three times. The other time the following is my inputLine that is read from the socket:

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

And the content is just 2197 whitespaces instead of a 2197 length content. Its really weird and I am stuck. Any help is appreciated. Thanks.

4

3 に答える 3

2

in.read() がバッファーを埋めると想定しています。あなたはそれを仮定することはできません。Javadoc を参照してください。少なくとも 1 文字を読み取るか、EOS のために -1 を返す必要があるだけです。

于 2012-06-22T23:32:37.037 に答える
0

@EJP: コードを書き直したところ、ようやく機能しました。問題は、場合によっては in.read() が最初の試行で POST 要求のヘッダーのみを読み取っていたことです。コンテンツの長さフィールドを確認する必要があり、指摘されたように読み取った文字数よりも少ない場合は、リクエストを完全に取得するためにもう一度 in.read() を実行する必要がありました。ありがとうございます!

于 2012-06-23T02:28:17.570 に答える
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 に答える