SocketとServerSocketのポート使用について混乱します。 Oracle's java tutorial about socketsは、次の言葉:クライアントを受け入れた後、Java ServerSocketは新しいソケットを同じローカルポートにバインドする方法を教えてください。
ソケットですか?
通常、サーバーは特定のコンピュータで動作し、特定のポート番号にバインドされたソケットを持っています。サーバーは、クライアントが接続要求を行うためにソケットを待機するだけです。 クライアント側:クライアントは、サーバーが稼動しているマシンのホスト名と、サーバーがリスンしているポート番号を知っています。接続要求を行うために、クライアントはサーバーのマシンとポート上のサーバーとのランデブーを試みます。また、クライアントはサーバーに自身を識別させる必要があるため、この接続中に使用するローカルポート番号にバインドします。これは、通常、システムによって割り当てられます。
すべてがうまくいくと、サーバーは接続を受け入れます。 受諾時に、サーバーは同じローカルポート にバインドされた新しいソケットを取得し、リモートエンドポイントも クライアントのアドレスとポートに設定します。 接続されたクライアントのニーズに対応しながら、接続要求のために元のソケット を引き続き受信できるように、新しいソケットが必要です。
クライアント側では、接続が受け入れられるとソケットが正常に作成され、クライアントはソケットを使用してサーバーと通信できます。 クライアントとサーバーは、ソケットへの書き込みまたはソケットからの読み取りによって通信できるようになりました。
次のコードを試してみました。しかし例外をスローします。
try {
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
// This prints 8080
System.out.println("Local port of accepted socket : " + socket.getLocalPort());
// But this throws java.net.BindException: Address already in use: JVM_Bind
Socket myClientSocket = new Socket("www.google.com", 80, null, 8080);
} catch (Exception e) {
e.printStackTrace();
}
私の質問は明らかです。 serverSocket.accept()
から返されたソケットは、同じローカルポート(8080
)を使用できますが、なぜ私が作成したソケットは使用できませんか?
それは彼らがそれを設計した方法なので。引用していることを明確にしてください。 – EJP