Java ServerSocket について話している場合listen
、おそらくクライアント側のソケットとは異なるため、メソッドはありません。その場合、(コンストラクター内または の一部としてbind
) ポート番号を取得すると、先に進んで自動的にリッスンできます。
「通常の」ソケット (BSD 風) に listen がある理由は、クライアントとサーバーに同じタイプが使用されるためです。ServerSocket
まあ、それはサーバーソケットなので、そうではありません:-)
accept
正直なところ、呼び出される前にリスニングがアクティブかどうかを気にする理由がわかりません。サーバーをビジネス用に開いているとマークするのは、(このクラスでは暗黙的な) "listen" 呼び出しです。その時点で、通信レイヤーが開始され、着信コールがキューに入れられ、コールを待機できるようになりますaccept
。プログラムが要求を受け入れるのが少し遅い場合に備えて、要求をキューに入れるのが一般的な方法です。
なぜそうするのかというと、実際にはソースコードによると想定されています。OpenJDK6source/share/classes/java/net/ServerSocket.java
では、すべてのコンストラクターが 1 つのコンストラクターを呼び出すことになります。
public ServerSocket(int port, int backlog, InetAddress bindAddr)
throws IOException {
setImpl();
if (port < 0 || port > 0xFFFF)
throw new IllegalArgumentException(
"Port value out of range: " + port);
if (backlog < 1)
backlog = 50;
try {
bind(new InetSocketAddress(bindAddr, port), backlog);
} catch(SecurityException e) {
close();
throw e;
} catch(IOException e) {
close();
throw e;
}
}
そして、(同じファイル)への呼び出しは次のbind
とおりです。
public void bind(SocketAddress endpoint, int backlog) throws IOException {
if (isClosed())
throw new SocketException("Socket is closed");
if (!oldImpl && isBound())
throw new SocketException("Already bound");
if (endpoint == null)
endpoint = new InetSocketAddress(0);
if (!(endpoint instanceof InetSocketAddress))
throw new IllegalArgumentException("Unsupported address type");
InetSocketAddress epoint = (InetSocketAddress) endpoint;
if (epoint.isUnresolved())
throw new SocketException("Unresolved address");
if (backlog < 1)
backlog = 50;
try {
SecurityManager security = System.getSecurityManager();
if (security != null)
security.checkListen(epoint.getPort());
getImpl().bind(epoint.getAddress(), epoint.getPort());
getImpl().listen(backlog);
bound = true;
} catch(SecurityException e) {
bound = false;
throw e;
} catch(IOException e) {
bound = false;
throw e;
}
}
関連するビットは次のとおりです。
getImpl().bind(epoint.getAddress(), epoint.getPort());
getImpl().listen(backlog);
つまり、ソケットを作成するときに、bind
との両方が下位レベルで実行されます。 listen
netstat
ですから、「なぜ突然 に現れるのか」という質問はそれほど多くありません。しかし、「なぜnetstat
以前に登場しなかったのですか?」
私はおそらくそれをあなたの側の読み違い、または のあまり良くない実装に置くでしょうnetstat
。呼び出していないソケットを特にテストしていない限り、前者の可能性が高くなりますaccept
。