ホームページ  >  記事  >  Java  >  URLConnection の接続、タイムアウト、およびシャットダウンの使用法の概要

URLConnection の接続、タイムアウト、およびシャットダウンの使用法の概要

巴扎黑
巴扎黑オリジナル
2016-12-20 13:46:221710ブラウズ

HttpURLConnection は Java で WEB リソースをリクエストするために使用できます。

1. URL リクエストのカテゴリ

は、GET リクエストと POST リクエストの 2 つのカテゴリに分かれています。 2 つの違いは次のとおりです:
a:) get リクエストは静的ページを取得することも、URL 文字列の後にパラメータを置いてサーブレットに渡すこともできます
b:) post と get の違いは、投稿のパラメータは URL 文字列には配置されず、http リクエストの本文に配置されます。

2. URLConnection オブジェクトの問題

Java コード

URL = new URL("http://localhost:8080/TestHttpURLConnectionPro.do");

URLConnection = url.openConnection (); / ここでの UrlConnection オブジェクトは、実際には URL の

// リクエスト プロトコル (ここでは http) に基づいています。

' s 's 's 's ‐ ‐ ‐ ‐ HttpURLConnection を使用する

3. HttpURLConnection オブジェクトのパラメータの問題

Java コード

// これはポストリクエストであるため、パラメータを http ボディに配置する必要があるため、設定する必要があります。デフォルトは false です。

httpUrlConnection.setDoInput(true);

//リクエストはキャッシュを使用できません

httpUrlConnection.setUseCaches(false);

// Set 送信されるコンテンツ タイプはシリアル化可能な Java オブジェクトであると判断されます

// (これが設定されていない場合、シリアル化されたオブジェクトを送信するとき、デフォルトの WEB サービスがこのタイプではない場合、java.io.EOFException がスローされる可能性があります)

httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");

//リクエストメソッドを「POST」に設定します。デフォルトは GET

httpUrlConnection.setRequestMethod("POST ");

//Connection、上記の項目 2 の url.openConnection() からこの時点までの設定を完了する必要があります。接続する前に、

Java コード

// ここで getOutputStream は暗黙的に接続します (つまり、上記の connect() メソッドを呼び出すのと同じように、

// したがって、開発中に上記の connect() を呼び出さなくても大丈夫です) 。

OutputStream outStrm = httpUrlConnection.getOutputStream();

5. HttpURLConnection のデータ書き込みとデータ送信の問題

Java コード

// 次に、出力ストリーム オブジェクトを介してオブジェクト出力ストリーム オブジェクトを構築し、シリアル化可能な出力オブジェクトを実現します。

ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm);

//データをオブジェクト出力ストリームに書き込み、データはメモリ バッファに保存されます

objOutputStrm.writeObject(new String("I am test data" ) ;現時点では、これ以上データをオブジェクト出力ストリームに書き込むことはできません。以前に書き込まれたデータはメモリ バッファーに存在します。

// 準備された http リクエストは、以下の getInputStream() 関数が呼び出されたときにのみ正式にサーバーに送信されます。 .

objOutputStm.close();

// HttpURLConnection 接続オブジェクトの getInputStream() 関数を呼び出します。

// メモリ バッファーにカプセル化された完全な HTTP リクエスト メッセージをサーバーに送信します。

InputStream inStrm = httpConn.getInputStream(); // <===実際にリクエストを送信するコードセグメントはここにあります

// 上記の httpConn.getInputStream() メソッドが呼び出されています。 request 終了しました。 オブジェクト出力ストリームへの次の出力は無意味です

// オブジェクト出力ストリームが close() メソッドを呼び出していない場合でも、次の操作はオブジェクト出力ストリームにデータを書き込みません。

// したがって、データを再送信する場合は、接続を再作成し、パラメータを再設定し、ストリームオブジェクトを再作成し、データを再書き込みし、

// データを再送信する必要があります(これらの操作は再調査する必要はありません。さらに調査する必要があります)

objOutputStm(new String(""));

Javaコード

OutputStream os = httpConn.getOutputStream();

param = new String (); = = + 電話番号 +

" "&msg=" + java.net.URLEncoder.encode(msg,"GBK ") ; ;

os.write(param.getBytes());

7. ネットワーク異常時にプログラムがフリーズして実行を継続しないようにするためのタイムアウト設定

System.setProperty(" sun.net.client.defaultConnectTimeout", "30000");

System.setProperty("sun.net.client.defaultReadTimeout", "30000");

ここで: sun.net. client.defaultConnectTimeout: タイムアウトホストへの接続のタイムアウト (単位: ミリ秒)

sun.net.client.defaultReadTimeout: ホストからのデータ読み取りのタイムアウト (単位: ミリ秒)

JDK 1.5 より前のバージョンのみを渡すことができます これら 2 つのシステム プロパティを次のように設定しますネットワークタイムアウトを制御します。 1.5では、HttpURLConnectionの親クラスURLConnectionの次の2つのメソッドも使用できます:

setConnectTimeout: 接続ホストのタイムアウトを設定します(単位: ミリ秒)

setReadTimeout: ホストからのデータ読み取りのタイムアウトを設定します(単位: ミリ秒) )

例:

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

urlCon.setReadTimeout(30000);

概要:

a : HttpURLConnection の connect() 関数は、実際にはサーバーとの TCP 接続を確立するだけであり、実際には http リクエストを送信しません。

post であっても get であっても、http リクエストは実際には HttpURLConnection の getInputStream() 関数まで正式に送信されません。

b: POST を使用して URL リクエストを送信する場合、URL リクエストパラメータの設定順序が最優先されます。

接続オブジェクト (設定された関数) のすべての設定は、connect() 関数の前に実行する必要があります。 OutputStream での書き込み操作は、inputStream での読み取り操作よりも前に行う必要があります。

これらの順序は、実際には http リクエストの形式によって決まります。

inputStream 読み取り操作が outputStream 書き込み操作よりも前にある場合、例外がスローされます:

java.net.ProtocolException: 入力の読み取り後に出力を書き込むことはできません....

c: http リクエストは実際には 2 つの部分で構成されます。は http ヘッダーです。この http リクエストに関するすべての設定は http ヘッダーで定義されます。

もう 1 つはコンテンツです。

connect() 関数は、HttpURLConnection オブジェクトの設定値に基づいて http ヘッダー情報を生成するため、connect 関数を呼び出す前に、

すべての設定を準備する必要があります。

d: http ヘッダーの直後に http リクエストの本文が続きます。本文の内容は、outputStream ストリームを通じて書き込まれます。実際、outputStream は単なる文字列ストリームです。書き込まれた内容はすぐにネットワークに送信されませんが、outputStream が閉じられると、入力内容に基づいて http ボディが生成されます。

この時点で、http によって要求されたすべての準備が整いました。 getInputStream() 関数が呼び出されると、準備された http リクエストが正式にサーバーに送信され、この http リクエストに対するサーバーの戻り情報を読み取るための入力ストリームが返されます。 http

リクエストはgetInputStream(httpヘッダーとボディを含む)中に送信されているため、getInputStream()関数

の後に接続オブジェクトを設定する(httpヘッダー情報を変更する)か、outputStreamに書き込む(ボディを変更する)

は無意味です。これらの操作を実行すると例外が発生します。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。