ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明

ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明

開発中にサーバーを起動する必要がある場合、ローカルテストではポートを直接書き込み、実際の環境ではバインドする IP も指定する必要があります。

サーバーに複数のネットワーク カードがある場合があり、システムは指定された IP とポートを介して通信する必要があるため、サーバーが使用する IP とポートを構成ファイルで定義する必要があります。

通常のテストでは、IP が指定されていない場合、ServerSocket はどこにバインドするのでしょうか?

この場合、サーバーはこのポートを 0.0.0.0 にバインドします。つまり、すべての IP にバインドし、各 IP でリクエストを受信できるようになります。 0.0.0.0 が何であるかについては、ここでは説明しません。

以下はテスト プログラムです。次のプログラムを通じて状況がどのようなものか確認できます。

パッケージテスト;
java.net.InetSocketAddress をインポートします。
java.net.ServerSocket をインポートします。
java.net.Socket をインポートします。
パブリッククラステスト{
	パブリック静的void main(String[] args)は例外をスローします{
		SocketClientクライアント = 新しいSocketClient();
		新しいスレッド(クライアント).start();
		
		ServerSocket serverSocket = 新しい ServerSocket();
		serverSocket.bind(新しいInetSocketAddress(8888));
// serverSocket.bind(新しいInetSocketAddress("127.0.0.1",8888));
// serverSocket.bind(新しいInetSocketAddress("192.168.1.100",8888));
		System.out.println(serverSocket.toString());
		serverSocket.accept();
	}
}
クラスSocketClientはRunnableを実装します{
	パブリックボイド実行() {
		試す {
			スレッド.sleep(2000);
			試す {
				ソケット socket = new Socket("127.0.0.1", 8888);
				System.out.println("127.0.0.1 成功" + socket.toString());
			} キャッチ (例外 e) {
				System.err.println("127.0.0.1 に失敗しました");
			}
			試す {
				ソケット socket = new Socket("192.168.1.100", 8888);
				System.out.println("192.168.1.100 成功" + socket.toString());
			} キャッチ (例外 e) {
				System.err.println("192.168.1.100 に失敗しました");
			}
		} キャッチ (例外 e) {
			e.printStackTrace();
		}
	}
}

この時点での印刷結果は次のとおりです。

サーバーソケット[アドレス=0.0.0.0/0.0.0.0、ポート=0、ローカルポート=8888]
127.0.0.1 成功ソケット[addr=/127.0.0.1,port=8888,localport=59213]
192.168.1.100 成功ソケット[addr=/192.168.1.100,port=8888,localport=59214]

127.0.0.1 を使用した場合の結果を印刷します。

サーバーソケット[アドレス=/127.0.0.1、ポート=0、ローカルポート=8888]
127.0.0.1 成功ソケット[addr=/127.0.0.1,port=8888,localport=59416]
192.168.1.100 失敗

192.168.1.100 を使用した場合の結果を印刷します。

サーバーソケット[アドレス=/192.168.1.100、ポート=0、ローカルポート=8888]
127.0.0.1 失敗
192.168.1.100 成功ソケット[addr=/192.168.1.100,port=8888,localport=59429]

デフォルトのバインディングは 0.0.0.0 であることがわかります。この時点で、このコンピューターにマークできる任意の IP を使用してポート 8888 にアクセスできます。

もちろん、これはデュアル ネットワーク カードの検証ではありません。まだ 1 つのネットワーク カードでプレイしているからです。条件が許せば、ブレードマシンで小さなテストを行うことができます。

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

以下もご興味があるかもしれません:
  • Java ネットワーク通信における ServerSocket の設計最適化スキーム
  • SocketクラスとServerSocketクラスに基づく例の説明
  • JAVA-NIO ソケット/サーバーソケット チャネル (詳細説明)
  • [Java] SocketとServerSocketの詳しい解説 勉強ノート
  • Socket および ServerSocket クラスの構築方法と API

<<:  MySQL CHARとVARCHARの保存と読み取りの違い

>>:  Vue3は独自のページングコンポーネントをカプセル化します

推薦する

vue+drf+サードパーティのスライディング検証コードアクセスの実装

目次1. 背景2. 検証プロセス3. 検証を作成する4. フロントエンドコード4.1 コアjsファイ...

VMware Workstation に Windows Server 2019 をインストールする (グラフィック チュートリアル)

キーの入力を求められた場合は、[キーがありません]を選択します。デスクトップエクスペリエンスを選択す...

Centos7 での Rsync+crontab 定期同期バックアップ

最近、社内の重要なサーバデータを定期的にストレージにバックアップし、ついでにメモしておきたい以前、W...

Dockerコンテナでユーザーを分離する方法

前回の記事「Docker コンテナの UID と GID を理解する」では、Docker コンテナ内...

Linux スクリプトの基礎を詳しく紹介

目次1. スクリプトvim環境2. シェルスクリプトで環境を定義する方法3. シェルスクリプト内の翻...

GitHub のサードパーティ認証方式を Vue で実装する例

目次OAuth アプリの作成コードを取得するaccess_tokenを取得するユーザー情報を取得する...

MySQL学習記録: KEYパーティションが引き起こした血なまぐさい事件

需要背景ビジネス テーブル tb_image のデータの一部は次のとおりです。id は一意ですが、i...

HTMLフォーム送信方法のケーススタディ

フォームの送信方法をまとめると次のようになります。 1. 送信ボタンを使用して送信します。送信ボタン...

Linux は、ディレクトリが存在するかどうかを判断するために if を使用します。

Linux で if を使用してディレクトリが存在するかどうかを判断する方法方法は次のとおりです。...

nginx のインストールが完了した後に PHP を解析できない問題の解決方法

目次方法1方法2 nginxをインストールした後、PHPコードを解析できないことがわかりました。解決...

ページのスクロールバーを無効にするには、overflow: hiddenを使用します。

コードをコピーコードは次のとおりです。 html {オーバーフロー: 非表示; }体{オーバーフロー...

MySQLインストール後のデフォルトデータベースの役割の詳細な説明

MySQL を学習すると、インストール後にいくつかのデフォルトのデータベースが付属していることに気付...

Windows Server 2008 R2 サーバーが理由もなく自動的に再起動する問題の解決策

Windows Server 2008 サーバーが自動的に再起動します。サーバーにログインした後、ど...

Workbench を介して MySQL データベースにリモートでアクセスする方法の詳細な説明

序文Workbench が 1 台のコンピューターにインストールされており、別の Ubuntu サー...