1

次のような Java コードがあります。

private void startServer() throws IOException {
        URLClassLoader classloader = null;

        System.out.println("Opening server socket for listening on " + PORT_NUMBER);
        try {
            server = new ServerSocket(PORT_NUMBER);
            server.setSoTimeout(10000);
            connected = true;
            System.out.println("Server is now listening on port " + PORT_NUMBER);
        } catch (IOException e) {
            System.err.println("Could not start server on port " + PORT_NUMBER);
            e.printStackTrace();
            connected = false;
        }

        while (connected) {

            // Incoming request handler socket.
            Socket socket = null;
            try {
                System.out.println("Waiting for client connection...");
                // Block waiting for an incoming connection.
                socket = server.accept();
                if (socket == null) continue;

...などなど。後で server.close() を呼び出すと (socket.close() を最初に呼び出しても動作は変わりません)、エラーは発生しませんが、netstat はポートがまだリッスンされていることを示しています。ServerSocket.close() を呼び出すだけで、このシステムのポートを解放できますか?

Java 1.4.2 マイクロエディション ランタイム用にプログラミングしています。このメソッドを別のスレッドで実行していて、その親スレッドからソケットを閉じようとしていることにも注意してください。

編集これは netstat からの行ですが、Xlet を再度開始すると、そのポート番号で例外が発生するため、まだリッスンされていることは保証できます。

tcp        0      0  *.2349                 *.*                    LISTEN
4

1 に答える 1

6

考慮すべき点がいくつかあります。それらの1つは、ServerSocketのJavaDocからの次の引用によって説明されています

public void setReuseAddress(boolean on) は SocketException をスローします

SO_REUSEADDR ソケット オプションを有効/無効にします。TCP 接続が閉じられると、接続が閉じられた後、しばらくの間、接続がタイムアウト状態のままになることがあります (通常、TIME_WAIT 状態または 2MSL 待機状態と呼ばれます)。既知のソケット アドレスまたはポートを使用するアプリケーションでは、ソケット アドレスまたはポートを含むタイムアウト状態の接続がある場合、必要な SocketAddress にソケットをバインドできない場合があります。

close()したがって、サーバーソケットの後に何かが起こっていることをOSが表示できるのは、まあまあです。しかし、同じポートでサーバー ソケットを頻繁に開いたり閉じたりすると、問題が発生する可能性があります。

于 2011-07-21T00:14:59.013 に答える