以前、単純な 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 を返します。 } } } 実行すると常にエラーが報告されます:
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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
背景検索エンジンで「.htaccess キャッシュ」というキーワードを検索すると、ウェブサイトのファ...
目次etcdの機能etcdが独自の高可用性クラスタを構築するには、主に3つの形式があります。今回構築...
VMに慣れた後、BOXに切り替えるのは少し異なります。たとえば、コピーネットワークカードを2枚使って...
この記事では、例を使用して、MySQL トランザクション、分離レベル、およびロックの使用について説明...
データベースの変更または削除操作によってデータ エラーが発生したり、データベースがクラッシュしたりす...
コンテンツ詳細タグ: <h1>~<h6>タイトルタグ<pre>テ...
Zabbix カスタム スクリプトを使用して監視データを収集する場合、通常、次の問題が発生します。サ...
目次分散IDソリューションの概要データベース自動増分IDデータベースマルチマスターモード数値セグメン...
Win10 システムに MySQL 8.0 をインストールする際に発生する問題と解決策は次のとおりで...
フロントエンドの初心者として、私は数日間フロントエンドをいじってみました。 。今日、私は自分が固く信...
目次JSはFileReaderを通じて.txtファイルの内容を取得します。 .txtファイルの読み取...
この記事では、MySQL 8.0.15 winx64のインストールと設定方法を参考までに紹介します。...
説明する2 つの日付間の時間間隔を返します。文法DateDiff(間隔、日付1、日付2 [、週の最初...
目次概要1. フロントエンドとバックエンドの分離とWeb APIの優先ルート設計2. Axiosネッ...
1: ターミナルに入ったらPHPのバージョンを確認する php -v出力は次のようになります。 PH...