2010-11-29 12 views
10

ServerSocketクラスのacceptメソッドを使用しているときに、どのようにポートが選択されているかを知っていますか?メソッドが選択できるポートの範囲を定義することは可能ですか?ちょうど順番にポートを1つずつ取ることができますか?ServerSocket accept()メソッド

ServerSocket sSocket = new ServerSocket(5050); 
Socket socket = sSocket.accept(); 

From the book

+0

getLocalPortを試して、それが真であるかどうかを確認してください。 – Codemwnci

+4

これはあなたが読んでいる良い本ですか? 「普通の古いソケット」は私にとって奇妙に聞こえる。 –

+0

はい、Head First Javaです。初心者向けの本です。 – Eugene

答えて

20

ダイアグラムが正しくありません(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を持っている)

+0

ありがとうございました。 – Eugene

+0

こんにちはSimonJ、なぜあなたはサーバー側が同じソケットポートを使用することができます説明できますか?ありがとう! – MrROY

+0

@MrROYクライアントはローカルポートをランダムに選択しているので、答えで言います。 – EJP

0

ServerSocketは、コンストラクタの一部としてポートを定義しています。 ポートを指定しないと、ソケットはバインドされていません(つまり、アクセスできません)。

接続ソケットのポートを取得するには、getLocalPort()ではなくgetPort()を使用します。もう1つはサーバーのポートを提供します。

+0

私は自分の質問にメモを追加しました。 2行目を見てください。ありがとうございます – Eugene

+1

私はあなたが何を意味するかはかなり分かりません。サーバーに接続されている100個のソケットはすべてポート5050で接続します。接続しているマシンのポートを意味する場合は、getPort()を使用します。 – Codemwnci

0

あなたが空いているポート上のサーバソケットを作成するために、ポート番号として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)を処理しませんが、追加できます。例えば、複数のクライアントが存在することができ

  • クライアントIP
  • クライアントポート
  • サーバーのIP
  • サーバーポート

+0

ServerSocket(i)?あなたはServerSocket(port)を意味しましたか? – Eugene

+0

@AndriodNood確かに、ありがとう、修正されました。 – khachik

+0

ServerSocketを最初に返したときに機能が停止するため、これは機能しませんか? – Arin

2

TCPコネクションは、4つの部分から構成され同じサーバポートに接続 - クライアントが同じIPを持たない限りおよび同じprt、それは大丈夫です。その部分については、オペレーティングシステムが注意を払っています。

したがって、1つのポートだけで聞くのは大丈夫です。

+0

ご清聴ありがとうございます。私はちょうど本から画像をアップロードしました。どうぞご覧ください。 – Eugene

+0

@Eugene本を忘れてしまった。それは間違っています。 – EJP

5

あなたは、ポートを選択しました。受け入れられたソケットに異なるポートを使用することに関するすべてのことは、100%BSです。

関連する問題