ServerSocketクラスのacceptメソッドを使用しているときに、どのようにポートが選択されているかを知っていますか?メソッドが選択できるポートの範囲を定義することは可能ですか?ちょうど順番にポートを1つずつ取ることができますか?ServerSocket accept()メソッド
ServerSocket sSocket = new ServerSocket(5050);
Socket socket = sSocket.accept();
ServerSocketクラスのacceptメソッドを使用しているときに、どのようにポートが選択されているかを知っていますか?メソッドが選択できるポートの範囲を定義することは可能ですか?ちょうど順番にポートを1つずつ取ることができますか?ServerSocket accept()メソッド
ServerSocket sSocket = new ServerSocket(5050);
Socket socket = sSocket.accept();
ダイアグラムが正しくありません(O'Reillyサイトのunconfirmed errataに記載されています)。
クライアントは、ランダムにそのポートを選択します(あなたはJavaで特別なことをする必要はありません)と、指定したいずれかのポートでサーバーに接続します。あなたがこれを見ることができますnetstat
コマンドラインツールを使用して - 最初、クライアントなしでちょうどリスニングサーバーソケット:
[email protected]:~$ netstat -n -a Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) ... tcp46 0 0 *.5050 *.* LISTEN ...
(他のエントリがたくさんある、私は関係のないものを削除しました)
- クライアントからサーバーへの1(1)、その他の[email protected]:~$ netstat -n -a Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) ... tcp4 0 0 127.0.0.1.64895 127.0.0.1.5050 ESTABLISHED <- 1 tcp4 0 0 127.0.0.1.5050 127.0.0.1.64895 ESTABLISHED <- 2 tcp46 0 0 *.5050 *.* LISTEN <- 3 ...
クライアントが同じマシンから接続されているので、我々は確立された2つの接続を参照してください。ローカルホスト(127.0.0.1)からの接続1つのクライアントと今
サーバーからクライアントへ(2)。彼らは(彼らはお互いに話しているので)反対側のローカルと外部のアドレスがあり、元のサーバーソケット(3)が同じポートで引き続きリッスンしている間、サーバー側がポート5050を使用していることがわかります。新しいServerSocketを(5050)を言ったとき
(これらは、Macからですが、Windows/Linuxは、同様の出力を与えるnetstat
を持っている)
ServerSocketは、コンストラクタの一部としてポートを定義しています。 ポートを指定しないと、ソケットはバインドされていません(つまり、アクセスできません)。
接続ソケットのポートを取得するには、getLocalPort()ではなくgetPort()を使用します。もう1つはサーバーのポートを提供します。
あなたが空いているポート上のサーバソケットを作成するために、ポート番号として0
を渡し、または指定された範囲内の任意の空きポートのサーバソケットを作成するには、このようなメソッドを行うことができます。
public java.net.ServerSocket createServerSocket(int rangeStart, int rangeEnd)
throws java.io.IOException {
for(int port=rangeStart; port<=randeEnd; port++) {
try {
return new ServerSocket(port);
} catch(java.net.BindException be) {
// debug/warning here
continue;
}
}
throw new java.io.IOException("Failed to create a server socket, all ports between " +
rangeStart + " - " + rangeEnd + " are already in use.");
}
ループは別の例外(たとえばSecurityException
)を処理しませんが、追加できます。例えば、複数のクライアントが存在することができ
:
あなたは、ポートを選択しました。受け入れられたソケットに異なるポートを使用することに関するすべてのことは、100%BSです。
getLocalPortを試して、それが真であるかどうかを確認してください。 – Codemwnci
これはあなたが読んでいる良い本ですか? 「普通の古いソケット」は私にとって奇妙に聞こえる。 –
はい、Head First Javaです。初心者向けの本です。 – Eugene