UDP DUP タイムアウト UPD ポート状態検出コード例

UDP DUP タイムアウト UPD ポート状態検出コード例

以前、単純な UDP サーバーとクライアントの例を書きましたが、その中で、自分自身をクライアントと見なすと、クライアントはデータを送信するために独自のポートを指定できると書きました。

ds.setSoTimeout(5000); はデータ収集のタイムアウトです。設定されていない場合は待機を意味します。これはテレビドラマの恋愛映画の待機時間よりも長く、結果は同じです。つまり、死ぬまで待ってから待機を停止します。ただし、このタイムアウト期間は、リクエストのタイムアウト期間と見なすことはできません。この概念に注意してください。このタイムアウト期間は、この期間中にネットワークからデータが取得されなかったことを示すためだけに使用され、データが取得されたとしても、それがあなたのものではない可能性があります。以下の例を見ると、これがわかります。

次にポートの問題があります。前述のように、ポートを自分で指定することも、自分自身をクライアントとして扱うこともできます。データを送信する必要がある場合は、接続オブジェクトを作成してからデータを送信します。このように、ポートは動的です。つまり、DatagramSocket オブジェクトが再初期化されたり消えたりしない限り、ローカルで開かれた UDP ポートは閉じられません。

次に、UDP ステータスの問題があります。実際、これについては以前、「UDP 接続オブジェクトの理解と使用」という記事があります。ステートレスとは、この接続に状態がないことを意味します。サーバーが存在するかどうかは誰にもわかりませんし、サーバーが停止しているかどうかも誰にもわかりません。しかし、ローカルの場合、DatagramSocket オブジェクトが常に存在する場合、ローカル ポートはステートフルであり、アクティブです。

次に例を挙げます。

パッケージテスト;
java.io.* をインポートします。
java.net.* をインポートします。
java.util.Arrays をインポートします。
/**
 * UDP クライアント プログラム。サーバーにデータを送信し、サーバーの応答情報を受信するために使用されます。*/
パブリッククラス UdpClientSocket {
	プライベートbyte[]バッファ = 新しいbyte[1024];
	プライベート静的 DatagramSocket ds = null;
	/**
	 * クライアントのパケット送信方法と応答情報の受信方法をテストします */
	パブリック静的void main(String[] args)は例外をスローします{
		UdpClientSocket クライアント = 新しい UdpClientSocket();
		文字列 serverHost = "127.0.0.1";
		int サーバーポート = 10002;
		client.send(serverHost、serverPort、新しいバイト[]{1,2,3,4,5});
		while(true){
			バイト[] bt = client.receive();
			if(null != bt && bt.length > 0)
				System.out.println("受信データ: " + Arrays.toString(bt));
			スレッドをスリープ状態にします(1000);
		}
	}
	/**
	 * コンストラクター、UDPクライアントの作成 */
	パブリック UdpClientSocket() は例外をスローします {
		ds = new DatagramSocket(8899); // クライアントとしてローカルポートにバインド ds.setSoTimeout(5000);
	}
	/**
	 * 指定されたサーバーにデータ情報を送信します */
	パブリックファイナルボイドセンド(ファイナルストリングホスト、ファイナルインタポート、ファイナルバイト[]バイト)はIOExceptionをスローします{
		DatagramPacket dp = 新しい DatagramPacket(bytes, bytes.length, InetAddress.getByName(host), port);
		ds.send(dp);
	}
	/**
	 * 指定されたサーバーから送り返されたデータを受信します */
	パブリックファイナルバイト[]受信()は例外をスローします{
		試す {
			DatagramPacket dp = 新しい DatagramPacket(バッファ、バッファ長);
			ds.receive(dp);		
			byte[]データ = new byte[dp.getLength()];
			System.arraycopy(dp.getData(), 0, データ, 0, dp.getLength());		
			データを返します。
		} キャッチ (例外 e) {
			e.printStackTrace();
			null を返します。
		}
	}
}

実行すると常にエラーが報告されます:

java.net.SocketTimeoutException: 受信がタイムアウトしました
java.net.PlainDatagramSocketImpl.receive0(ネイティブメソッド)
java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136) で
java.net.DatagramSocket.receive(DatagramSocket.java:712) で
test.UdpClientSocket.receive(UdpClientSocket.java:46) で
test.UdpClientSocket.main(UdpClientSocket.java:20) で
java.net.SocketTimeoutException: 受信がタイムアウトしました
java.net.PlainDatagramSocketImpl.receive0(ネイティブメソッド)
java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136) で
java.net.DatagramSocket.receive(DatagramSocket.java:712) で
test.UdpClientSocket.receive(UdpClientSocket.java:46) で
test.UdpClientSocket.main(UdpClientSocket.java:20) で

TCPUDPDbg を使用して 8899 にデータを送信すると、次のものを受信できます。

受信データ: [16, 17, 18, 19, 20]

この例は次のように書かれています

1. ローカルポートは8899です

2. データ受信のタイムアウトは5秒です

3. データ セットがローカル ポート 10002 に送信されました。受信されたかどうかはだれが知っていますか?

4. ローカルポート8899で受信したUDPデータを継続的に取得する

そして発見した

1. データ送信時にエラーが報告されない

2. 「データ収集タイムアウト」というエラーメッセージが常に表示される

3. TCPUDPDbgを使用して8899にデータを送信すると、受信できるようになります。

要約:

1.UDPはデータ受信のタイムアウトを指定できますが、リクエストごとのタイムアウトは自分で制御する必要があります。

2.UDPはローカルポート番号をバインドすることができ、このポートは状態を維持することができる。

3.UDPには状態がないが、ローカルには状態がある

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL での重複キー更新時の replace into と insert into の使用法と相違点の分析
  • Java 並行性 AtomicLongFieldUpdater アトミッククラス_PowerNode Java アカデミー
  • 重複キー更新におけるMySQLのReplace intoとInsert intoの本当の違い
  • MySQL ON DUPLICATE KEY UPDATE ステートメントの例
  • 重複キーの挿入…更新/置換複数行データの概要
  • MySQLの「ON DUPLICATE KEY UPDATE」構文の詳細な分析
  • mysql 挿入のいくつかの操作 (DELAYED、IGNORE、ON DUPLICATE KEY UPDATE)

<<:  削除、切り捨て、ドロップの違いと選択方法

>>:  js における浅いコピーと深いコピーの詳細な説明

推薦する

MySQL データベース データのロード 複数の用途

目次MySQL Load Dataの多様な用途1. LOAD の基本的な背景2. 基本パラメータをロ...

Mac OS 10.11 での MySQL 5.7.12 のインストールと設定のチュートリアル

Mac OS 10.11 に MySQL をインストールして設定する方法を、主に写真を使って手順を簡...

MySQLで最新のトランザクションIDを照会する方法

前に書いた内容: ビジネス ロジックの判断を行うために、最新のトランザクション ID を表示する必要...

XHTMLにおけるH1タグの位置について

最近、H1 については多くの議論が行われていますが (記事のコンテンツ ページ内)、おおよそ 2 つ...

純粋なHTML+CSSでタイピング効果を実現

この記事は主に、一定の参考値を持つ純粋な HTML + CSS によって実現されるタイピング効果を紹...

Vue での this.$set の動的データバインディングのケーススタディ

インターネット上の this.$set の説明はわかりにくいと感じます。単一データ、オブジェクト、配...

パーティクルダイナミックボタン効果を実現するCSS

オリジナルリンクhttps://github.com/XboxYan/no…ボタンは、おそらく We...

MySQL 外部キー制約の一般的な操作の例 [表示、追加、変更、削除]

この記事では、例を使用して、MySQL 外部キー制約の一般的な操作について説明します。ご参考までに、...

Linux viコマンドの知識ポイントと使い方のまとめ

Linux viコマンドの詳しい説明vi エディタは、すべての Unix および Linux システ...

Webデザインチュートリアル(6):デザインへの情熱を持ち続ける

<br />前の記事:Webデザインチュートリアル(5):Webビジュアルデザイン。 1...

Docker Machineの詳細な説明

Docker と Docker Machine の違いDocker はクライアント サーバー アーキ...

GTK ツリービューの原理と使用法の分析

GtkTreeView コンポーネントは、美しい通常のリストやツリーのようなリストを作成できる高度な...

MySQLトリガーの使用と理解

目次1. トリガーとは何ですか? 2. トリガーを作成するトリガーを作成するための構文は次のとおりで...

MySQL テーブル フィールドの時間設定のデフォルト値

アプリケーションシナリオデータ テーブルでは、アプリケーションは各データがいつ作成されたかを記録する...