Java httpurlconnectionサーバーから複数の応答を受信する方法
-
28-09-2019 - |
質問
サーバーに私を購読するように依頼する投稿メッセージを使用してサーバーに接続しようとしています。サーバーは、HTTP接続を開いて開き、サブスクリプションをキャンセルするか、自分で接続を閉じることを要求するまで、ライブステータスで非同期メッセージを送信します。サーバーからこれらのその後の応答を読むのに苦労しています。以下のコードはサーバーに接続し、最初の応答を正常に読み取り、コンソールに印刷します。問題は、それが無限に同じ応答(最初の応答)を読み続け、画面に印刷し続けることです。
誰かが私がここで台無しにしているものを見ますか?サーバーからの次の非同期メッセージを見て、それが来るまでブロックしようとしています。また、次のメッセージが非同期に表示されたときに通知を受けるために登録する方法を知っている場合、私はそれがさらに良くなるのをブロックする必要がないようにします。
public void HttpSubscription()
{
byte[] result = new byte[10240];
try
{
/* Generate the hard coded request data */
final StringBuffer soap = new StringBuffer();
soap.append("<s:Envelope><s:Body><SoapTest1>thing1</SoapTest1></s:Body></s:Envelope>");
// to make HTTP Post request with HttpURLConnection
URL url = new URL("http://192.168.1.110:80/services");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// then set some properties and make a request
conn.setRequestMethod("POST");
conn.setRequestProperty( "Content-type", "text/xml; charset=utf-8" );
// Get a handle to the output stream
OutputStream OStream = conn.getOutputStream();
// Write the soap data to the output stream
OStream.write(soap.toString().getBytes());
InputStream ResponseStream = conn.getInputStream();
while (true)
{
int len = ResponseStream.read(result);
String value = new String(result);
System.out.println(value);
}
}
catch (Exception e)
{
System.out.println(e);
}
return;
}
解決
あなたが説明したのはHTTPではなく、それは別のものです。サーバーを実装させることができるかもしれませんが、そうではないかもしれません。しかし、HTTPURLCONNECTIONがHTTPプロトコルに違反していることを理解することを期待していることは、少し多くを求めていると思いますか?
他のヒント
少し古いですが、ここで露骨な誤った情報を修正することにしました。
HTTPリクエストの複数の応答がHTTP仕様に従っていないことを示す回答は間違っています!
から RFC 2616:
10ステータスコード定義
各ステータスコードについては、以下に説明します。これには、どの方法に従うことができるか、および応答に必要なメテイン形成の説明が含まれます。
10.1情報1xx
このクラスのステータスコードは、ステータスラインとオプションのヘッダーのみで構成される暫定的な応答を示し、空の行で終了します。このクラスのステータスコードに必要なヘッダーはありません。 HTTP/1.0は1XXステータスコードを定義していないため、サーバーは実験条件下を除き、HTTP/1.0クライアントに1xx応答を送信してはなりません。
クライアントは、クライアントが100(継続)ステータスメッセージを期待していなくても、通常の応答の前に1つ以上の1XXステータス応答を受け入れる準備をする必要があります。予期しない1XXステータス応答は、ユーザーエージェントによって無視される場合があります。